排列多个ggplots,但避免因轴标签而造成压扁

时间:2016-09-16 11:13:15

标签: r ggplot2 gridextra gtable cowplot

我一直在使用cowplot :: plot_grid来安排多个ggplot数字,这些数字一般都很好用。但是,我现在遇到了一个问题,我想在底部的情节中包含x轴标签,但它最终会压缩所有的图(使用align =" vh")或者列中最低的图(使用align =" v")。

是否有任何方法可以提取x轴标签grob,并将其添加为plot_grid中的另一个图(对于图例可能类似于https://github.com/wilkelab/cowplot/blob/master/vignettes/shared_legends.Rmd)?还是另一种方法?

感谢您的任何想法!

library(ggplot2)
library(cowplot)

a = data.frame(a = rnorm(100), b = rep(c("laskjdflsakjd", "cknmlokfjoweijojf"), 50))
b = data.frame(a = rnorm(100), b = rep(c("laskjdflsakjd", "cknmlokfjoweijojf"), 50))
c = data.frame(a = rnorm(100), b = rep(c("laskjdflsakjd", "cknmlokfjoweijojf"), 50))

aplot = ggplot(a, aes(x=b, y=a)) + geom_bar(stat = "identity")
bplot = ggplot(b, aes(x=b, y=a)) + geom_bar(stat = "identity")
cplot = ggplot(c, aes(x=b, y=a)) + geom_bar(stat = "identity") + theme(axis.text.x = element_text(angle=90, vjust = 0.5))

plot_grid(aplot + theme(axis.text.x = element_blank(), axis.title.x = element_blank()),
        bplot + theme(axis.text.x = element_blank(), axis.title.x = element_blank()),
        cplot, ncol = 1, align = "vh")

enter image description here

1 个答案:

答案 0 :(得分:0)

你可以直接玩相对高度,虽然它可能需要相当多的修补(并且会随着你的地块尺寸变化而改变)。此外,对于单个列,您应该只能使用align = "v" - " h"选项也试图排列图的底部(因此为什么它重新添加轴标签的空间)。

这对我来说效果很好:

plot_grid(aplot + theme(axis.text.x = element_blank(), axis.title.x = element_blank())
          , bplot + theme(axis.text.x = element_blank(), axis.title.x = element_blank())
          , cplot
          , ncol = 1
          , align = "v"
          , rel_heights = c(0.5,0.5,1)
          )

enter image description here

此外,这是强制性的建议,考虑facet_wrap虽然您的实际用例可能不允许。

最后,我过去曾试图提取轴来做你的建议:它不顺利。我有很大的问题让他们正确排队并最终放弃尝试返回设置rel_heights

为了完整起见,这是一种使用facet_wrap的方法(使用bind_rows中的dplyr):

df <-
  bind_rows(a = a, b = b, c = c
            , .id = "df")

ggplot(df, aes(x=b, y=a)) +
  geom_bar(stat = "identity") +
  facet_wrap(~df, ncol = 1) +
  theme(axis.text.x = element_text(angle=90, vjust = 0.5))

enter image description here