【问题标题】:Problems with common legend in RR中常见图例的问题
【发布时间】:2019-09-15 18:04:05
【问题描述】:

我正在尝试结合一系列 22 个情节的图例,但我根本无法成功。

我的传说代表几个月,每个情节都不同,有些只有几个月的信息。

所以最后的图例只显示我的第一个图的图例(只有 2 个月的数据),并且我没有其他图在所有月份中的数据可用于完成图例。

有什么办法解决这个问题?

试试这个: ggarrange(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, ncol=6, nrow=4, common.legend = TRUE, legend="bottom")

https://oregonstate.box.com/s/gxgo93mpva9wdx9lcfem26cer8ixpcs8

【问题讨论】:

  • 请通过包含示例数据和代码使您的问题可重现。避免使用数据或代码的图像。使用dput 获取数据。

标签: r ggplot2 legend


【解决方案1】:

为了更好地理解障碍,有趣的是你提供了一些可重复的例子,但通过你的文字我认为可以理解你的问题的基础。

最近我看到了类似的东西,并设法以一种不太优雅的方式解决了。

  1. 在没有图例的情况下组织所有情节。

p1p22show.legend = FALSE 对应您绘图集中的每个“行”(nrow)。然后转换成grob

library(cowplot)
obj1 <- cowplot::plot_grid(p1,  ..., p6,  align = "hv", nrow = 1)
obj2 <- cowplot::plot_grid(p7,  ..., p12, align = "hv", nrow = 1)
obj3 <- cowplot::plot_grid(p13, ..., p18, align = "hv", nrow = 1)
obj4 <- cowplot::plot_grid(p19, ..., p22, NULL, NULL, align = "hv", nrow = 1)

g1grob <- ggplot2::ggplotGrob(obj1)
g2grob <- ggplot2::ggplotGrob(obj2)
g3grob <- ggplot2::ggplotGrob(obj3)
g4grob <- ggplot2::ggplotGrob(obj4)

您可以继续使用ggarrange,但不一定介意您需要分享图例。我建议使用align = "hv" 参数(link)观察cowplot 包的plot_grid 函数。

  1. 您需要创建一个对象 (objx),以便它具有最复杂的标题,解决您所有的兴趣点。对于这个对象,您应该使用带有get_legend (link) 函数的cowplot 包获取其标题。
objx <- ggplot2::ggplot(df) + 
                 ... +
              theme(legend.position = "bottom")

legend <- cowplot::get_legend(objx) 
  1. 完成此操作后,只需将感兴趣的对象、情节 (obj) 和图例 (legend) 结合起来。
lay <- rbind(c(1, 1, 1, 1, 1, 1),
             c(2, 2, 2, 2, 2, 2),
             c(3, 3, 3, 3, 3, 3),
             c(4, 4, 4, 4, 4, 4))
plot_leila <- gridExtra::grid.arrange(g1grob, g2grob, g3grob, g4grob,
                                      layout_matrix = lay)

lay <- rbind(c(rep(1,12)),
             c(2))
plot_leila <- gridExtra::grid.arrange(plot_leila, legend,
                                      layout_matrix = lay)
plot_leila 

最终可能会出现错位,但只要耐心并测试软件包,您一定会得到一个好的结果。

【讨论】: