2017-04-19 76 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