R中常见图例的问题

时间:2019-04-26 08:46:50

标签: r ggplot2 legend

我正在尝试合并一系列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

1 个答案:

答案 0 :(得分:0)

为了更好地理解障碍,您提供了一些可重现的示例很有趣,但是通过您的文字,我认为可以理解问题的基本知识。

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

  1. 执行所有图例的组织而没有图例。

p1p22,其中show.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,但不一定需要共享图例。我建议使用plot_grid参数(link)来观察cowplot包的align = "hv"函数。

  1. 您需要创建一个对象(objx),以使其具有最复杂的标题,并满足您的所有兴趣点。对于此对象,应该使用带有cowplotlink)函数的get_legend包来获取其标题。
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 

  

最终可能会发生对齐错误,但是如果耐心等待并测试软件包,您肯定会获得良好的结果。