R' cowplot'整齐地生成带有共享(常见)图例和独特图例的网格图

时间:2017-10-20 10:32:44

标签: r plot ggplot2 grid-layout cowplot

查看我的相关问题和接受的答案here

我正在尝试制作类似于已接受答案中的情节,即网格图,其中共享的共同图例和不同的唯一图例附加到网格上的每个图。

具体来说,我想要一个3行,1列网格,每行有1个绘图。像这样:

enter image description here

使用以下代码生成:

  library (ggplot2)
  library(gridExtra)
  library (grid)
  library(cowplot)


   diamonds2 <- diamonds[sample(nrow(diamonds), 500), ]

   # 3 ggplot plot objects with multiple legends 1 common legend and 3 unique legends

  p1<- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape= cut )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")

  p2 <- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape=   color )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")

  p3 <- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape= clarity )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")

  cowplot::plot_grid(
  cowplot::plot_grid(
  p1 + scale_color_discrete(guide = FALSE),
  p2 + scale_color_discrete(guide = FALSE),
  p3 + scale_color_discrete(guide = FALSE),
  nrow=3, ncol = 1))

但是有一个共享的图例,它与每个绘图对象的color =参数有关。

我已经尝试了以下代码的许多变体,并在咨询cowplot文档后添加/调整/删除了各种参数/参数,但我无法得到像上面那样的整齐的情节与共享底部的传说(或任何有用的!) - 我尝试的一切都会返回如下所示的拥挤情节。

修改上述代码以包含共享图例:

  cowplot::plot_grid(
   cowplot::plot_grid(
    p1 + scale_color_discrete(guide = FALSE),
    p2 + scale_color_discrete(guide = FALSE),
    p3 + scale_color_discrete(guide = FALSE),
    nrow=3, ncol = 1
   ),
   cowplot::get_legend(p1 + scale_shape(guide = FALSE) +   theme(legend.position = "bottom")), nrow=3)

这导致像这样拥挤的情节有很多空白区域:

enter image description here

有人可以建议我哪里出错吗?

1 个答案:

答案 0 :(得分:2)

每次拨打plot_grid都会分割您的绘图区域。在这里,您正在嵌套两个对plot_grid的调用,并且您要求每行调用3行。 cowplot 因此将绘图区域分成两部分:

  • 在顶部,它会显示您的散点图
  • 在底部,您的图例占据第一行,底部两行中没有任何内容在压缩散点图时会产生大量空白空间。

您可以指定每个绘图区域的相对高度,为散点图提供更多空间,并为底部的图例指定更少的空间。例如85%的情节和15%的传奇:

cowplot::plot_grid(
   cowplot::plot_grid(
    p1 + scale_color_discrete(guide = FALSE),
    p2 + scale_color_discrete(guide = FALSE),
    p3 + scale_color_discrete(guide = FALSE),
    ncol = 1, align = "v"
   ),
   cowplot::get_legend(p1 + scale_shape(guide = FALSE) + 
      theme(legend.position = "bottom")),
   ncol=1, rel_heights=c(.85, .15))

产生:

enter image description here