对齐多面图和图例

Posted

技术标签:

【中文标题】对齐多面图和图例【英文标题】:Aligning facetted plots and legends 【发布时间】:2016-07-24 23:09:47 【问题描述】:

我正在尝试绘制各个方面,每个方面都有自己的图例。但是,我在正确对齐时遇到了一些麻烦。

dat <- structure(list(group1 = structure(c(1L, 1L, 2L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), group2 = structure(c(1L, 2L, 1L, 3L, 
2L), .Label = c("a", "b", "c"), class = "factor"), x = c("1", 
"2", "3", "4", "2"), y = c("1", "2", "3", "4", "3")), .Names = c("group1", 
"group2", "x", "y"), row.names = c(NA, 5L), class = "data.frame")

dat <- split(dat, f = dat$group1)

library(ggplot2)
p1 <- ggplot(dat$A) +
  geom_point(aes(x=x, y=y, colour=group2)) +
  facet_wrap(~group1) +
  guides(colour=guide_legend(nrow=2)) +
  scale_colour_manual(values=c(a = "green", b = "red", c = "blue"), 
                      labels=c(a = "green", b = "red", c = "blue"))

p2 <- p1 %+% dat$B

使用gridExtra 的问题是图不对齐:

library(gridExtra)
grid.arrange(p1, p2, p2, p1, ncol=2)

并且使用cowplot,图例有点居中:

library(cowplot)
plot_grid(p1, p2, p2, p1, ncol=2, align="hv")

我尝试添加legend.justification 和/或legend.position,但没有任何效果。

如何使两个图/图例对齐?

【问题讨论】:

我们可以添加 guides(col = guide_legend(nrow = 3)) 以便图例占据相同的宽度大小。 @zx8754 我的真实数据有更多的因子水平,基于方面从 2-10 不等。没有办法解决多列但列数不同的问题。 【参考方案1】:

你可以试试the experimental egg package。

grid.draw(ggarrange(plots=list(p1,p2,p2,p1)))

请注意,ggplot2 习惯于在每次更新时破坏这种类型的代码,因此认为这是一种脆弱的解决方法。

【讨论】:

谢谢,我要怎么做才能访问函数ggarrange @beetroot : devtools::install_github('baptiste/egg') 安装它 感谢您的帮助,它现在也适用于我的示例。但是根据我的实际数据,我得到了错误:Error: ncol(x) == ncol(y) is not TRUE @beetroot 你能分享一个最小的例子吗? 现在完美运行。非常感谢您的帮助以及您在 gridExtra 等方面的出色工作。:)

以上是关于对齐多面图和图例的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化分面图(faceting): 堆叠柱状图的分面图编写自定义函数在分面图的左侧添加图例信息(legend)

R语言ggplot2可视化将图例移动到分面图(facet)中的空白分面区域实战

更改 ggplot2 中条形图和图例的默认颜色

在 MATLAB 中创建包含散点图和正态图的图例

ggplot2:为彩色条形图和图例添加不同的纹理[重复]

echarts图例中图标文字对齐