2017-04-19 73 views
0

我有两个不同大小的数据库,dtdt1。我想使用gridExtra包中的命令grid.arrange并排显示g1g2。如果可能的话,我还希望看到g1g2使用facet_gridfacet_wrap命令或使用gridExtra,但使用facet_grid\facet_wrap直观。我在互联网上进行了长时间的搜索,无法使用下面的代码获取这些图形。使用`gridExtra`和多个方面并排图形

set.seed(000) 
m <- matrix(rnorm(1000,0,1),1000,1) 
dt <- data.frame(m) 
names(dt) <- c("X") 

library(ggplot2) 

g1 <- ggplot(dt, aes(x=X)) 
g1 <- g1+geom_histogram(aes(y=..density..),  # Histogram with density instead of count on y-axis 
         binwidth=.5, 
         colour="black", fill="white",breaks=seq(-2, 2, by = 0.1)) 
g1 <- g1 + stat_function(fun=dnorm, 
         color="black",geom="area", fill="gray", alpha=0.1, 
         args=list(mean=mean(dt$X), 
            sd=sd(dt$X))) 
g1 <- g1+ geom_vline(aes(xintercept=0, linetype="Valor Verdadeiro"),show.legend =TRUE) 
g1 <- g1+ geom_vline(aes(xintercept=mean(dt$X, na.rm=T), linetype="Valor Estimado"),show.legend =TRUE) 
g1 <- g1+ scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot 
g1 <- g1+ xlab(expression(paste(gamma[1])))+ylab("Densidade") 
g1 <- g1+ theme(plot.margin=unit(c(0.5, 0.5, 0.5, 0.5), units="line"), 
       legend.position = "top", 
       legend.justification = c(0,0), 
       legend.box.just = "top", 
       legend.margin = margin(0,0,-10,-5), 
       legend.title=element_blank(), 
       legend.direction = "horizontal", 
       legend.background = element_rect(fill="transparent", size=.5, linetype="dotted")) 
g1 <- g1+ guides(linetype = guide_legend(override.aes = list(size = 1))) 


# Adjust key height and width 
g1 = g1 + theme(
    legend.key.height = unit(.6, "cm"), 
    legend.key.width = unit(1, "cm")) 

# Get the ggplot Grob 
gt = ggplotGrob(g1) 

# grid.ls(grid.force(gt)) # To get a list of editable grobs 

# Edit the relevant keys 
library(grid) 
gt <- editGrob(grid.force(gt), gPath("key-1-[3,7]-[1,2]"), 
       grep = TRUE, global = TRUE, 
       x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
       x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 

# Draw it 
grid.newpage() 
g1 <- grid.draw(gt) 

m1 <- matrix(rnorm(2000,0,1),2000,1) 
dt1 <- data.frame(m1) 
names(dt1) <- c("Z") 
library(ggplot2) 

g2 <- ggplot(dt1, aes(x=Z)) 
g2 <- g2+geom_histogram(aes(y=..density..),  # Histogram with density instead of count on y-axis 
         binwidth=.5, 
         colour="black", fill="white",breaks=seq(-2, 2, by = 0.1)) 
g2 <- g2 + stat_function(fun=dnorm, 
         color="black",geom="area", fill="gray", alpha=0.1, 
         args=list(mean=mean(dt1$Z), 
            sd=sd(dt1$Z))) 
g2 <- g2+ geom_vline(aes(xintercept=0, linetype="Valor Verdadeiro"),show.legend =TRUE) 
g2 <- g2+ geom_vline(aes(xintercept=mean(dt1$Z, na.rm=T), linetype="Valor Estimado"),show.legend =TRUE) 
g2 <- g2+ scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot 
g2 <- g2+ xlab(expression(paste(gamma[1])))+ylab("Densidade") 
g2 <- g2+ theme(plot.margin=unit(c(0.5, 0.5, 0.5, 0.5), units="line"), 
       legend.position = "top", 
       legend.justification = c(0,0), 
       legend.box.just = "top", 
       legend.margin = margin(0,0,-10,-5), 
       legend.title=element_blank(), 
       legend.direction = "horizontal", 
       legend.background = element_rect(fill="transparent", size=.5, linetype="dotted")) 
g2 <- g2+ guides(linetype = guide_legend(override.aes = list(size = 1))) 


# Adjust key height and width 
g2 = g2 + theme(
    legend.key.height = unit(.6, "cm"), 
    legend.key.width = unit(1, "cm")) 

# Get the ggplot Grob 
gt2 = ggplotGrob(g2) 

# grid.ls(grid.force(gt)) # To get a list of editable grobs 

# Edit the relevant keys 
library(grid) 
gt2 <- editGrob(grid.force(gt2), gPath("key-1-[3,7]-[1,2]"), 
       grep = TRUE, global = TRUE, 
       x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
       x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 

# Draw it 
grid.newpage() 
g2 <- grid.draw(gt2) 

#library(gridExtra) 
#grid.arrange(grid.draw(gt),grid.draw(gt2)) 
+0

我不明白的问题,可以请你说清楚一点? (“但是与”) – baptiste

回答

1

这是做什么您要找的grid.arrange(gt, gt2, ncol = 2)

g1并在代码g2NULL,因为你,他们是通过调用grid.draw,这doesn't返回任何内容创建)

要使用facet_wrap你需要的所有数据进入一个数据帧与长格式:

library(tidyr) 
df <- cbind.data.frame(dt, dt1) 
df <- gather(df, key = "db", value = "value") 

然后剧情:

p <- ggplot(df, aes(x = value)) + 
geom_histogram(aes(y = ..density..), 
       binwidth = .5, 
       breaks = seq(-2, 2, by = .1)) + 
facet_wrap(~ db) 
+0

谢谢@wibom!我能够在你的帮助下解决我的问题! – fsbmat