2

我一直在使用 cowplot::plot_grid 来排列多个 ggplot 图形,总的来说效果很好。但是,我现在遇到了一个问题,我想在底部图上包含 x 轴标签,但它最终会挤压所有图(使用 align =“vh”)​​或最低图(使用 align =“ v") 列中。

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

感谢您的任何想法!

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")

在此处输入图像描述

4

1 回答 1

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)
          )

在此处输入图像描述

此外,facet_wrap尽管您的实际用例可能不允许这样做,但这是必须考虑的强制性建议。

最后,我过去曾尝试提取轴来执行您的建议:它并不顺利。我在让它们正确排列时遇到了巨大的问题,最终放弃了返回设置的尝试rel_heights

为了完整起见,这是一种使用facet_wrap(使用bind_rowsfrom 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))

在此处输入图像描述

于 2016-09-16T13:32:46.230 回答