2016-05-14 11 views
1

Ich versuche, mehrere verschiedene ggplots (siehe Code unten) in einem Diagramm zu plotten.Plot mehrere verschiedene Arten von ggplots in einem Diagramm

Ich dachte, das sollte es tun:

library(ggplot2) 
library(Rmisc) 
set.seed(1) 
y <- rnorm(12,0,1) 
df <- data.frame(y=rep(y,3),age=rnorm(12,50,2),sex=c(rep("female",6),rep("male",6)),race=c(rep("black",3),rep("white",3),rep("other",3))) 
df$sex <- as.factor(df$sex) 
df$race <- as.factor(df$race) 
covariates = c("age","sex","race") 
ggplot_list <- vector(mode="list", length(covariates)) 
for(i in 1:length(covariates)){ 
    if(is.factor(df[,covariates[i]])){ 
    ggplot_list[[i]] <- ggplot(df, aes(x=df[,covariates[i]], y=df$y), environment = environment())+geom_boxplot()+geom_jitter()+labs(x = covariates[i],y="y") 
    } else{ 
    ggplot_list[[i]] <- ggplot(df, aes(x=df[,covariates[i]], y=df$y), environment = environment())+geom_point(shape=1)+labs(x = covs[i],y="y") 
    } 
} 

Aber:

multiplot(plotlist=ggplot_list,cols=length(covariates)) 

Hilfe ..

Gibt: enter image description here

Antwort

1

Innen aes Sie sollten nur auf Spaltennamen beziehen, anstatt beiden Datenrahmen Namen einschließlich und Spaltennamen. Sie haben den Datenrahmen bereits an ggplot (ggplot(df,...)) übergeben, sodass ggplot bereits Zugriff auf die Datenrahmenspalten innerhalb seiner Umgebung hat. Das Einschließen des Datenrahmens innerhalb von aes untergräbt das, indem ggplot angewiesen wird, nach draußen in die Elternumgebung für den Datenrahmen zu gehen. Hier ist eine Version Ihres Codes, die das tut, was Ihnen scheint. Wir verwenden aes_string statt aes, so dass wir die Werte von covariates als Strings passieren kann:

ggplot_list <- vector(mode="list", length(covariates)) 

for(i in 1:length(covariates)){ 
    if(is.factor(df[,covariates[i]])){ 
    ggplot_list[[i]] <- ggplot(df, aes_string(x=covariates[i], y="y")) + 
     geom_boxplot() + 
     geom_jitter() + 
     labs(x = covariates[i], y="y") 
    } else{ 
    ggplot_list[[i]] <- ggplot(df, aes_string(x=covariates[i], y="y")) + 
     geom_point(shape=1) + 
     labs(x = covariates[i],y="y") 
    } 
} 

Hier ist eine kurze Version:

# List to store plots 
pl = list() 

for (i in covariates) { 

    # Set up parts of plot that don't change 
    pl[[i]] = ggplot(df, aes_string(x=i, y="y")) + labs(x = i) 

    # Different handling for categorical and numeric x variable 
    if (is.numeric(df[,i])) { 
    pl[[i]] = pl[[i]] + geom_point(shape=1) 
    } else { 
    pl[[i]] = pl[[i]] + geom_boxplot() + geom_jitter(width=0.2) 
    } 
} 

Sie können dies auch mit lapply tun statt einer for-Schleife :

pl = lapply(covariates, function(cc) { 

    # Set up parts of plot that don't change 
    p = ggplot(df, aes_string(x=cc, y="y")) + labs(x = cc) 

    # Different handling for categorical and numeric x variable 
    if (is.numeric(df[, cc])) { 
    p = p + geom_point(shape=1) 
    } else { 
    p = p + geom_boxplot() + geom_jitter(width=0.2) 
    } 
}) 

die Plots zu legen, verwenden grid.arrange vom gridExtra-Paket (plot_grid von cowplot ist eine weitere Option, wie sie durch @JoshuaRosenberg darauf hingewiesen):

library(gridExtra) 
grid.arrange(grobs=pl, ncol=length(covariates)) 

enter image description here

0

Versuchen cowplot (Vignette here).

Sobald Sie die ggplot Objekte, so etwas wie:

plot_grid(plot_age, plot_gender, plot_race)

Verwandte Themen