用patchwork对齐多个图例

10
patchwork这个示例中,解释了如何组合多个ggplot。我遇到的一个困难是当图例标题的字符数非常不同时,如何收集它们并对齐/调整它们的位置。
以下是一个示例 - 我希望'mpg'图例也能左对齐/对齐,并且不要居中在'Size'图例下面。有什么建议吗?请注意,添加theme(legend.justification = "left")不能解决问题。
library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp, colour = mpg, size = wt)) + 
  guides(size = guide_legend(title = "Size - long title for the purpose of this example")) +
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  ggtitle('Plot 2')

p3 <- ggplot(mtcars) + 
  geom_point(aes(hp, wt, colour = mpg)) + 
  ggtitle('Plot 3')

(p1 | (p2 / p3)) + plot_layout(guides = 'collect')

reprex包 (v0.3.0)于2019-12-16创建


1
哦,实际上这似乎是一个已开放的问题 - Valentin_Ștefan
解决方法:在长标题中添加换行符。 title =“Size - long title for\\nthe purpose of this example” - G5W
1个回答

7

同时,这个问题已经被Ilia Kats修复

使用& theme(legend.justification = "left")(当保持图例与绘图分离/对齐时)或+ plot_layout(guides = 'collect')(从图表中合并图例)现在可以正常工作。

使用remotes::install_github("thomasp85/patchwork")来更新patchwork(如果是pre ~2020版本)。


详细示例:
library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) +
  geom_point(aes(mpg, disp, colour = mpg, size = wt)) +
  guides(size = guide_legend(title = "Size - long title for the purpose of this example")) +
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) +
  geom_boxplot(aes(gear, disp, group = gear)) +
  ggtitle('Plot 2')

p3 <- ggplot(mtcars) +
  geom_point(aes(hp, wt, colour = mpg)) +
  ggtitle('Plot 3')

OP的问题已经解决:

(p1 | (p2 / p3)) + plot_layout(guides = 'collect')

但默认情况仍未对齐:

(p1 / p3)

通过合并参考线对齐(现已修复):

(p1 / p3) + plot_layout(guides = 'collect')

左对齐(现已固定):

(p1 / p3) & theme(legend.justification = "left")

(如果两个图之间没有共享的图例,这将是理想的情况(所以这只是一个使用不良的例子))

reprex package(v0.3.0)于2020-09-10创建

# Session info: 
R version 4.0.1 (2020-06-06),            
 ggplot2     * 3.3.1      2020-05-28 [1] CRAN (R 4.0.0)                        
 patchwork   * 1.0.1.9000 2020-09-10 [1] Github (thomasp85/patchwork@82a5e03)

1
谢谢您指出这个问题。看起来这个 bug 确实已经被修复了,在 (p1 | (p2 / p3)) + plot_layout(guides = 'collect') 之后甚至不需要添加 theme(legend.justification = "left")(至少在我上面的示例中是这样)。如果您能编辑您的回答,使其适用于我已经提供的代码,而不仅仅是 GitHub 问题/拉取请求页面的截图,那就更好了。 - Valentin_Ștefan
@Valentin 很好知道,我相应地扩展了答案。 - jan-glx
注意,当使用theme_void()时,此功能似乎会失败。 - tjebo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接