ggplot2 - 使用grid.arrange()与facet同时保持facet大小不变

时间:2014-07-07 03:45:45

标签: r ggplot2

基本上,我希望复制facet_grid()效果,但是有些列有自己的比例。为了演示,以下代码接近我想要的内容:

library(ggplot2)
library(reshape2)
library(gridExtra)

set.seed(65421)

gg.df1 <- data.frame(x = c(1:20, 1:20),
                     A = sort(rnorm(40)),
                     B = sort(rnorm(40))+0.5,
                     C = sort(rnorm(40))+1,
                     y_lab = c(rep('1', 20), rep('2', 20)))

gg.df1 <- melt(gg.df1, id.vars=c("x", "y_lab"))

gg.df2 <- data.frame(x = c(1:20, 1:20),
                     D = abs(sort(rnorm(40))*200),
                     E = abs(sort(rnorm(40))*205),
                     y_lab = c(rep('1', 20), rep('2', 20)))

gg.df2 <- melt(gg.df2, id.vars=c("x", "y_lab"))


p1 <- ggplot(gg.df1, aes(x, value)) + geom_line() + facet_grid(y_lab ~ variable) + theme(strip.text.y=element_blank(), strip.background=element_rect(fill=NA, colour=NA))
p2 <- ggplot(gg.df2, aes(x, value)) + geom_line() + facet_grid(y_lab ~ variable) + labs(y=NULL) + theme(strip.background=element_rect(fill=NA, colour=NA))

grid.arrange(p1, p2, nrow=1, widths=c(3, 2))

output

(我将小平面条涂成白色,因此很容易只有一组标签。)

请注意,所有构面都具有相同的x轴(在实际数据中也是如此)。但是,由于grid.arrange()和子图的性质与widths参数交互,因此两个子图之间的构面区域的大小是不同的。有没有一种好方法可以保证face.arrange()中的facet大小相同,或者使用其他命令复制此效果?

1 个答案:

答案 0 :(得分:2)

如果组合gtables很容易,默认面板宽度为unit(1, "null"),所以它们都是相等的

  grid.draw(gtable:::cbind_gtable(ggplotGrob(p1), ggplotGrob(p2), "first"))