使用gridExtra

时间:2016-02-25 17:55:55

标签: r ggplot2 gridextra

我尝试使用ggplot2和gridExtra在R中构建一个5 x 6的图表矩阵。为简单起见,我可以用2 x 2矩阵和一些假数据来显示我的问题。

#Load libraries
  library(ggplot2); library(gridExtra)

#Data
  data = rbind(data.frame(x=rnorm(100,0,1),ALP='A',NUM=1),data.frame(x=rnorm(100,20000,1000),ALP='A',NUM=2),data.frame(x=rnorm(100,100,10),ALP='B',NUM=1),data.frame(x=rnorm(5000,1000),ALP='B',NUM=2))

#Ggplot2 facet_grid
  ggplot(data,aes(x=x,y=..scaled..,fill='red')) + geom_density() + facet_grid(ALP~NUM,scales='free') + guides(fill=FALSE)

enter image description here

结果并不好看,因为刻度标签的x刻度差异很大。我尝试用gridExtra手动完成。

#Assemble grobs
  plt1 = ggplot(subset(data,ALP=='A'&NUM==1),aes(x=x,y=..scaled..,fill=ALP)) + geom_density() + facet_grid(.~NUM,scales='free') + guides(fill=FALSE) + theme(axis.title.x=element_blank(),axis.title.y=element_blank())
  plt2 = ggplot(subset(data,ALP=='A'&NUM==2),aes(x=x,y=..scaled..,fill=ALP)) + geom_density() + facet_grid(ALP~NUM,scales='free') + guides(fill=FALSE) + theme(axis.text.y=element_blank(),axis.ticks.y=element_blank(),axis.title.y=element_blank(),axis.title.x=element_blank())
  plt3 = ggplot(subset(data,ALP=='B'&NUM==1),aes(x=x,y=..scaled..,fill=ALP)) + geom_density() + guides(fill=FALSE) + theme(axis.title.x=element_blank(),axis.title.y=element_blank())
  plt4 = ggplot(subset(data,ALP=='B'&NUM==2),aes(x=x,y=..scaled..,fill=ALP)) + geom_density() + facet_grid(ALP~.,scales='free') + guides(fill=FALSE) + theme(axis.text.y=element_blank(),axis.ticks.y=element_blank(),axis.title.y=element_blank(),axis.title.x=element_blank())

#Plot it out
  grid.arrange(plt1,plt2,plt3,plt4,nrow=2,ncol=2,left=textGrob("scaled",rot=90,vjust=1),bottom=textGrob("x"))

enter image description here

我几乎就在那里,不幸的是,右上角的绘图面板(x,y)小于其他所有部分。同样,左下角的绘图面板(x,y)比其余部分都要大。我希望所有绘图面板(x,y)具有相同的高度/宽度。我发现了一些使用gtable的代码,但是当grobs没有facet标签时,它似乎只能保持一致。当行数/列数增加时,效果更加夸大。

1 个答案:

答案 0 :(得分:1)

作为facetting的替代方法,你可以使用gtable,

plt <- lapply(list(plt1,plt2, plt3,plt4), ggplotGrob)

left <- rbind(plt[[1]], plt[[3]])
right <- rbind(plt[[2]], plt[[4]])
all <- cbind(left, right)
grid.newpage()
grid.draw(all)

面板尺寸应该与此布局相等(1null)。

enter image description here