【问题标题】:How to add a shared legend for 9 plots grid.arrange如何为 9 个图 grid.arrange 添加共享图例
【发布时间】:2021-08-17 23:19:31
【问题描述】:

我是 ggplot2 的新手,我正在尝试将 9 个不同的图绘制在一个图中,我想添加一个共同的图例。

在这里你可以看到我想要绘制的 pearsons 相关性:

PEARSONSCORRELATIONS_MOD1
 [1] 0.10470688 0.10827255 0.12322448 0.11887717 0.12719741 0.12635607 0.13427974
 [8] 0.13539245 0.13636687 0.13834174 0.13864013 0.13816236 0.13640052 0.13775515
[15] 0.13563827 0.13968726 0.12499506 0.11836173 0.11097081 0.09829338 0.10470688

*每个型号都不同(如果需要,请告诉我)。

这是情节的代码:

z

 PLOTPEARSON_MOD1 <-ggplot (data=df_MOD1, mapping= aes (x=z, y=PEARSONSCORRELATIONS_MOD1))+
  geom_line()+
  geom_point(col="black")+
  scale_x_continuous(name="", breaks=z, labels=PEARSONSCORRELATIONS2)+
  geom_point(col="black", shape=42,size=7, aes(11, PEARSON30_MOD1))+
  theme_light()+
  scale_y_continuous(name="",limits = c(-.1, 1), breaks=seq(-.1,1, by= .1 ))+
  theme(axis.text.x=element_text(angle=90, size=5))+
  ggtitle ("Model 1")

请注意,我使用 geom_point 添加了一个点。

这是我用来将九个图合二为一的代码:

grid.arrange (arrangeGrob(PLOTPEARSON_MOD1)
              ,arrangeGrob(PLOTPEARSON_MOD4)
              ,arrangeGrob(PLOTPEARSON_MOD7)
              ,arrangeGrob(PLOTPEARSON_MOD2)
              ,arrangeGrob(PLOTPEARSON_MOD5)
              ,arrangeGrob(PLOTPEARSON_MOD8)
              ,arrangeGrob(PLOTPEARSON_MOD3)
              ,arrangeGrob(PLOTPEARSON_MOD6)
              ,arrangeGrob(PLOTPEARSON_MOD9)
              , ncol=3,nrow=3,top="Title")

但我被困住了。我想为这个情节添加一个共同的图例。我曾尝试使用“共享图例”,但我什至无法为每个情节放置一个简单的图例。这是一个黑白图,我只需要展示一下:

*(shape=42)="文本" 圆圈(默认形状)=“文本”

有没有办法添加一个简单的图例?或者如何为每个情节添加图例?

希望我已经正确解释了这一点。这是我在这里的第一篇文章。

非常感谢您。

祝你好运

【问题讨论】:

    标签: r ggplot2 plot


    【解决方案1】:

    没有为形状和颜色显示图例的原因是您没有将形状和颜色映射到任何变量——您只是将它们设置为常量值。仅当美学特征(尺寸/颜色/形状/线型/等)映射到某个变量时,才会创建图例。否则, ggplot2 假定它只是一个设计元素。如果该形状旨在映射一个变量,您需要将形状参数映射到aes(),就像您拥有xy 参数一样。

    看看这个例子。在这里,我为绘图的数据框添加了一个“组”变量,然后将此变量映射到 aes() 内的 shape

    library(ggplot2)
    
    df <- data.frame(
      index = 1:21,
      corr = c(0.10470688, 0.10827255, 0.12322448, 0.11887717, 0.12719741, 0.12635607, 0.13427974,
               0.13539245, 0.13636687, 0.13834174, 0.13864013, 0.13816236, 0.13640052, 0.13775515,
               0.13563827, 0.13968726, 0.12499506, 0.11836173, 0.11097081, 0.09829338, 0.10470688),
      group = c(rep("Group A", 14), rep("Group B", 7))
    )
    
    p1 <- ggplot(df) +
      aes(x = index, y = corr, shape = group) +
      geom_point(size = 2) +
      theme_light()
    p1
    

    映射变量后,您可以手动选择要与scale_shape_manual() 一起使用的形状:

    # specify specific shapes, see http://www.cookbook-r.com/Graphs/Shapes_and_line_types/
    p2 <- ggplot(df) +
      aes(x = index, y = corr, shape = group) +
      geom_point(size = 2) +
      theme_light() +
      scale_shape_manual(values = c(16, 17))
    p2
    

    为了在网格中排列图,我强烈推荐patchwork package 而不是grid.arrange()。这是一个更现代的包,更易于使用,并且在对齐轴等方面也做得更好。通过拼凑,您可以将 + 绘图在一起。您可以使用plot_layout() 控制行数/列数。您还可以使用该函数来告诉它收集所有在绘图中相同的指南(图例)到整个拼凑而成的组合图例中。您可以在软件包网站上查看其他选项。

    library(patchwork)
    p1 + p1 + p1 + p1 + p1 + p1 + p1 + p1 + p1 +
      plot_layout(ncol = 3, nrow = 3, guides = "collect")
    

    reprex package (v2.0.0) 于 2021-05-30 创建

    (最后一件事:当您发布问题时,最好发布任何人都可以复制和粘贴以运行而无需修改的完整代码。我在上面的示例中这样做了。这称为“可重现示例”。在您发布的代码中,您的代码不会加载任何库并包含您尚未在代码中定义的对象名称,例如 PEARSONSCORRELATIONS2,因此我需要先编辑您的代码才能运行它。reprex::reprex() 函数可以很容易地制作一个可复制的示例,您可以将其粘贴到这样的页面上。)

    【讨论】:

    • 非常感谢您的有用回答。我现在需要添加标签,正如我在此线程中发布的那样。再次感谢您。
    【解决方案2】:

    非常感谢您的有用回答。

    我现在会一直使用完整的代码。

    效果很好,现在我正在尝试按照您的建议将九个地块拼凑在一起。

    我已经设法让它工作,但我无法为每个地块添加标签。我用 grid.arrange() 完成了如下操作:

    library(ggplot2)
    library(gridExtra)
    library(grid)
    library(lattice)
    
    t <- textGrob("Proportion of S1>S2 on Variable1")
    
    lay <- rbind(c(1,2,3),
                 c(1,2,3),
                 c(1,2,3),
                 c(1,2,3),
                 c(1,2,3),
                 c(1,2,3),
                 c(1,2,3),
                 c(4,4,4),
                 c(5,6,7),
                 c(5,6,7),
                 c(5,6,7),
                 c(5,6,7),
                 c(5,6,7),
                 c(5,6,7),
                 c(5,6,7),
                 c(8,8,8),
                 c(9,10,11),
                 c(9,10,11),
                 c(9,10,11),
                 c(9,10,11),
                 c(9,10,11),
                 c(9,10,11),
                 c(9,10,11),
                  c(12,12,12))
    
    grid.arrange (arrangeGrobPLOTPEARSON_MOD1, top="High w", left="High p correlation")
                  ,arrangeGrob(PLOTPEARSON_MOD4,top="Medium w correlation")
                  ,arrangeGrob(PLOTPEARSON_MOD7,top="Low w correlation")
                  ,arrangeGrob(t)
                  ,arrangeGrob(PLOTPEARSON_MOD2, left="Medium p correlation")
                  ,arrangeGrob(PLOTPEARSON_MOD5)
                  ,arrangeGrob(PLOTPEARSON_MOD8)
                  ,t
                  ,arrangeGrob(PLOTPEARSON_MOD3, left="Low p correlation")
                  ,arrangeGrob(PLOTPEARSON_MOD6)
                  ,arrangeGrob(PLOTPEARSON_MOD9)
                  ,t
                  , ncol=3,nrow=24,top="Title", layout_matrix=lay)
    

    有没有办法为每个图和图子集添加标签?

    再次感谢您。

    祝你好运

    【讨论】:

    • 要么使用labs() 为每个绘图添加标题,要么使用plot_annotation(tag_levels = "a") 将标签添加到拼凑中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2018-09-24
    • 2021-11-15
    • 2016-01-17
    • 2020-02-24
    相关资源
    最近更新 更多