【问题标题】:Adjust legends for each individual graph on ggarrange in R调整 R 中 ggarrange 上每个单独图形的图例
【发布时间】:2020-03-30 12:48:48
【问题描述】:

我有三个 geom_point 图表,绘制了与 ggarrange 一起排列的 3 个不同变量。最终输出显示了相互叠加的图例。尝试common_legend = TRUE 时,它只显示第一个的图例。是否可以安排图例,以便我为每个图表(右侧)设置三种颜色比例,然后在每个图表的某处设置变量名称。

这是一个可重现的示例: 数据集:

Samples <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) 
X = c(1.16, 1.16,   0.96,   0.96,   0.96,   0.67,   0.67,   0.67,   0.78,   0.78,   0.55,   0.3,    0.3,    0.3,    0.26,   0.26,   0.26) 
Y = c(75.45, 75.45, 86.66, 86.66, 86.66, 103.36, 103.36, 103.36, NA, NA, 107.53, NA, NA, NA, 128.49, 128.49, 128.49)
AA = c(0.003437318, 0.005842468,    0.005573348,    0.006074338,    0.002537367,    0.006583666,    0.006015314,    0.010983784,    0.009116288,    0.010872489,    0.010924257,    0.009359167,    0.009068434,    0.00601658, 0.017616501,    0.014813675,    0.018048576) 
BB = c(0.007614672, 0.007632451,    0.007066506,    0.007524053,    0.008337992,    0.012520277,    0.012249,   0.011351902,    0.01263021, 0.009969673,    0.008850031,    0.007290232,    0.00724349, 0.007161781,    0.004299581,    0.004896156,    0.005970637) 
CC = c(0.002133046, 0.00168291, 0.001580502,    0.001491037,    0.001295399,    0.001644785,    0.001738881,    0.001496376,    0.00140218, 0.001247361,    0.001364975,    0.001209774,    0.000933038,    0.002034014,    0.000665552,    0.000855588,    0.000878233)

这是用于创建单个数据框并使用三个合并的 gig-ggplots 进行绘图的代码:

library(ggplot2)
library(ggpubr)
coex1 = data.frame(Samples, X, Y, AA)
coex1 <- data.frame(X,Y,value = c(AA), letters = rep(c("AA"), each = length(AA)))

coex2 = data.frame(Samples, X, Y, BB)
coex2 <- data.frame(X,Y,value = c(BB), letters = rep(c("BB"), each = length(BB)))

coex3 = data.frame(Samples, X, Y, CC)
coex3 <- data.frame(X,Y,value = c(CC), letters = rep(c("CC"), each = length(CC)))


p1 <- ggplot(coex1,aes(x=X,y=Y,shape=letters,col=value, col=value))+geom_jitter(width=0.05) +  scale_color_gradient(low="blue", high="red")
p2 <- ggplot(coex2,aes(x=X,y=Y,shape=letters,col=value, size=value))+geom_jitter(width=0.05) +  scale_color_gradient(low="blue", high="red")
p3 <- ggplot(coex3,aes(x=X,y=Y,shape=letters,col=value, size=value))+geom_jitter(width=0.05) +  scale_color_gradient(low="blue", high="red")


ggarrange(p1, p2, p3, rremove("x.text"), 
          labels = c("a", "b", "c"),
          ncol = 1, nrow = 3, legend = "right")

输出:

【问题讨论】:

    标签: r ggplot2 ggpubr


    【解决方案1】:

    你用这种方法让自己的生活变得非常困难。使用 ggplot 神奇的分组功能,就不需要情节组合包了。

    您可以按审美和/或方面进行分组。见下文。关键是让你的数据长,见下文。看看它是如何显着减少你的代码的。

    我还介绍了如何将颜色和大小组合到一个图例中。 see this thread

    library(tidyverse)
    
    mydat <- data.frame(Samples, X, Y, AA, BB, CC) %>% 
      pivot_longer(names_to = "letters", values_to = "value", cols = AA:CC) %>%
      group_by(letters) %>%
      mutate(scaled_val = scale(value)) %>%
      ungroup()
    
    ggplot(mydat, aes(X, Y, col = scaled_val, size = scaled_val)) +
      geom_jitter(width = 0.05) +
      scale_color_gradient(low = "blue", high = "red") +
      facet_grid(~letters) +
      guides(color=guide_legend(), size = guide_legend())
    #> Warning: Removed 15 rows containing missing values (geom_point).
    

    reprex package (v0.3.0) 于 2020 年 3 月 30 日创建

    数据

    Samples <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)
    X <- c(1.16, 1.16, 0.96, 0.96, 0.96, 0.67, 0.67, 0.67, 0.78, 0.78, 0.55, 0.3, 0.3, 0.3, 0.26, 0.26, 0.26)
    Y <- c(75.45, 75.45, 86.66, 86.66, 86.66, 103.36, 103.36, 103.36, NA, NA, 107.53, NA, NA, NA, 128.49, 128.49, 128.49)
    AA <- c(0.003437318, 0.005842468, 0.005573348, 0.006074338, 0.002537367, 0.006583666, 0.006015314, 0.010983784, 0.009116288, 0.010872489, 0.010924257, 0.009359167, 0.009068434, 0.00601658, 0.017616501, 0.014813675, 0.018048576)
    BB <- c(0.007614672, 0.007632451, 0.007066506, 0.007524053, 0.008337992, 0.012520277, 0.012249, 0.011351902, 0.01263021, 0.009969673, 0.008850031, 0.007290232, 0.00724349, 0.007161781, 0.004299581, 0.004896156, 0.005970637)
    CC <- c(0.002133046, 0.00168291, 0.001580502, 0.001491037, 0.001295399, 0.001644785, 0.001738881, 0.001496376, 0.00140218, 0.001247361, 0.001364975, 0.001209774, 0.000933038, 0.002034014, 0.000665552, 0.000855588, 0.000878233)
    

    【讨论】:

    • 感谢代码提示!看起来更好!但是,显示单个图例/渐变的想法是,在您绘制的这种情况下,CC 上的点几乎没有区别(全部显示为低蓝色),因为 CC 范围和 AA、BB 范围不同。除非有办法标准化范围?如果您有任何想法,请告诉我。
    • @Ecg 你说得对 - 缩放是一个好主意,并且在比较不同的值时也可能是更好的方法......缩放!请参阅更新的代码以了解执行此操作的方法
    • 完美的@Tjebo 这看起来和我的想法一模一样。非常感谢您的帮助!
    • 谢谢!这是我太挑剔了但我以前没见过,是否可以将图例合并成一个独特的图例,其中大小的圆圈根据调色板着色?
    • @Ecg 这是可能的。请参阅我的更新答案。还包括指向相关主题的链接。
    【解决方案2】:

    我们可以添加legend.box = "horizontal 并为每个ggplot 上的图例设置正确的顺序。

    然后,在ggarrange 上添加widthalign = "v"

    p1 <- ggplot(coex1,aes(x=X, y=Y, shape=letters, col=value, col=value)) +
      geom_jitter(width=0.05) +
      scale_color_gradient(low="blue", high="red") +
      theme(legend.box = "horizontal")+
      guides(color = guide_legend(order=1),
             size = guide_legend(order=2),
             shape = guide_legend(order=3))
    
    
    p2 <- ggplot(coex2,aes(x=X, y=Y, shape=letters, col=value, size=value)) +
      geom_jitter(width=0.05) +
      scale_color_gradient(low="orange", high="yellow") +
      theme(legend.box = "horizontal")+
      guides(color = guide_legend(order=1),
             size = guide_legend(order=2),
             shape = guide_legend(order=3))
    
    
    
    p3 <- ggplot(coex3,aes(x=X, y=Y, shape=letters, col=value, size=value)) +
      geom_jitter(width=0.05) +
      scale_color_gradient(low="green", high="cyan") +
      theme(legend.box = "horizontal")+
      guides(color = guide_legend(order=1),
             size = guide_legend(order=2),
             shape = guide_legend(order=3))
    
    
    ggarrange(p1, p2, p3 + rremove("x.text"), 
              labels = c("a", "b", "c"),
              ncol = 1, nrow = 3,
              legend = "right",
              widths = c(2, 2, 3),
              align = "v"
              )
    

    【讨论】:

    • 对不起,但这不起作用(在您的答案中也没有),因为它仍然显示图例相互重叠,而不是显示所有图例。我想知道这是否是高度/宽度/坐标的问题?
    • 哦,我想我明白了。让我试试
    • 听起来很棒@Ecg。顺便说一句,我注意到您不需要在 ggarrange 上添加宽度配置
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多