安排多个ggplots,但避免由于轴标签而挤压
Posted
技术标签:
【中文标题】安排多个ggplots,但避免由于轴标签而挤压【英文标题】:Arrange multiple ggplots, but avoid squishing due to axis label 【发布时间】:2017-01-24 14:26:39 【问题描述】:我一直在使用 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")
【问题讨论】:
【参考方案1】:您可以直接使用相对高度,但可能需要进行一些修改(并且会随时更改您的地块大小)。此外,对于单列,您应该只能够使用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_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))
【讨论】:
谢谢马克 - 我现在也恢复到 rel_heights 修复,但希望在某个时候找到更强大的解决方案...facet_wrap
不起作用的原因是什么?这可能是更强大的解决方案(但只有在图都相同的情况下才有效)
是的,facet_wrap 不能很好地对齐轴。即使它们是“相同”的图,如果 y 比例不同,例如,一个到 10,另一个到 100,轴不会对齐。此外,实际上,我正在混合一些情节(对于可重复的示例使它们相同)。 Cowplot 在排列方面做得很好,但是这个 x 轴问题很痛苦。我想一定有办法通过 grobs 等来做到这一点,但我真的不了解所有细节。也许没有……以上是关于安排多个ggplots,但避免由于轴标签而挤压的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中使用带有 facet_wrap 的 ggplot2 显示多个轴标签
r 将多个ggplot2图与一个共同的x轴和不同的y轴对齐,每个轴都有不同的y轴标签。
R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,使x轴和Y轴的标签文本都使用粗体字体)注意是轴标签而非轴标题
R语言ggplot2可视化使用guide_axis函数避免X轴标签互相重叠(Overlapping)Dodge Overlapping X-axis Text with guide_axis()