【问题标题】:Assign color to 2 different geoms and get 2 different legends将颜色分配给 2 个不同的几何图形并获得 2 个不同的图例
【发布时间】:2015-04-09 02:52:16
【问题描述】:

如何让 ggplot2 为不同的几何图形提供单独的图例,它们都使用颜色来表示 2 个不同的变量。我想要 3 个图例,一个用于 zab,但 a 和 b 似乎组合成一个图例,即使 a 和 b 代表不同的变量。我还希望能够控制每个图例中的颜色。

dat <- data.frame(
    y = rnorm(200),
    x = sample(c("A", "B"), 200, TRUE),
    z = sample(100:200, 200, TRUE), 
    a = sample(c("male", "female"), 200, TRUE),
    b = factor(sample(1:2, 200, TRUE))
)

ggplot(dat, aes(y = y, x = x)) +
    geom_point(aes(color = a, size = z)) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b)) +
    scale_color_manual(values = c("#F8766D", "#00BFC4", "orange", "purple"))

【问题讨论】:

  • 可能是一种更简单的方法,但您可以绘制两个图,然后合并图例...stackoverflow.com/questions/26727741/…
  • @user20650 我考虑过这一点,如果需要,我会走那条路,但似乎应该有更简单的方法。
  • 我明白为什么要将它们分开,但是对于任何其他美学(透明度、大小、形状、彩条等),将它们分开是没有意义的。例如,透明度 0-25 是一个变量,另一个变量是 26-50,这是相同的比例。当然,颜色可以更加离散,因此它可以更有意义..只是我的想法,为什么这不是直截了当的。 hadley 对他的 ggplot 非常讲究
  • @rawr 我正在写我论文的一部分,描述图形的分层语法。实际上,我看不到对此有用的应用程序,因为我们正在重载预属性,以至于没有任何东西突出并且它们被仔细处理。语法的美妙之处在于它在封闭系统中是灵活的,以至于图形遵循语法但没有意义。

标签: r ggplot2


【解决方案1】:

如果您使用填充的绘图符号,您可以将一个因子映射为填充,另一个映射为颜色,然后将它们分成两个比例,从而形成图例。

ggplot(dat, aes(y = y, x = x)) +
  geom_point(aes(fill = a, size = z), pch = 21) + 
  geom_boxplot(fill = NA, size=.75, aes(color=b)) +
  scale_color_manual(values = c("orange", "purple")) +
  scale_fill_manual(values = c("#F8766D", "#00BFC4"))

【讨论】:

  • 谢谢。对于这种特殊情况,我认为这种方法很简单,也是大多数人会选择的。
【解决方案2】:

ggnewscale 让这一切变得非常简单:

library(ggplot2)
library(ggnewscale)

ggplot(dat, aes(y = y, x = x)) +
  geom_point(aes(color = a, size = z)) + 
  scale_color_brewer(palette = 'Dark2') +
  new_scale_color() +
  geom_boxplot(fill = NA, aes(color = b)) +
  scale_color_brewer(palette = 'Paired')

reprex package (v0.3.0) 于 2020-01-08 创建

任何scale_color 都可以照常使用。为了方便,我选择了 scale_color_brewer

【讨论】:

    【解决方案3】:

    似乎图例捕获方法在类似情况下是最通用的,尽管在@jennybryan's 上的这个特定方法更简单,可能是大多数人想要的。我也在这里记录了图例捕获方法。我首先从@Sandy Muspratt HERE 那里学到了这种方法。

    dat <- data.frame(
        y = rnorm(200),
        x = sample(c("A", "B"), 200, TRUE),
        z = sample(100:200, 200, TRUE), 
        a = sample(c("male", "female"), 200, TRUE),
        b = factor(sample(1:2, 200, TRUE))
    )
    
    if (!require("pacman")) install.packages("pacman")
    pacman::p_load(ggplot2, grid, gridExtra, gtable)
    
    coldot <- ggplot(dat, aes(y = y, x = x)) +
        geom_point(aes(color = a, size = z)) + 
        #geom_boxplot(fill = NA, size=.75, aes(color=b)) +
        scale_color_manual(values = c("#F8766D", "#00BFC4"))
    
    colbox <- ggplot(dat, aes(y = y, x = x)) +
        #geom_point(aes(color = a, size = z)) + 
        geom_boxplot(fill = NA, size=.75, aes(color=b)) +
        scale_color_manual(values = c("orange", "purple"))
    
    
    
    leg1 <- gtable_filter(ggplot_gtable(ggplot_build(coldot)), "guide-box") 
    leg1Grob <- grobTree(leg1)
    
    leg2 <- gtable_filter(ggplot_gtable(ggplot_build(colbox)), "guide-box") 
    leg2Grob <- grobTree(leg2)
    
    
    noleg <- ggplot(dat, aes(y = y, x = x)) +
        geom_point(aes(color = a, size = z)) + 
        geom_boxplot(fill = NA, size=.75, aes(color=b), position=position_dodge(1)) +
        scale_color_manual(values = c("orange", "purple", "#F8766D", "#00BFC4")) +
        theme(
            plot.margin = unit(c(5.1, 4.1, 4.1, 2.1), "pt"),
            legend.position=c(1.3, 0.87)
        ) +
        guides(color = FALSE)
    
    legs <- ggplot(data = data.frame(x=1, y=1)) +
        geom_blank(aes(x=x, y=y)) + 
        theme_minimal() + 
        ylab(NULL) + xlab(NULL) +
        theme(
            axis.text = element_blank(),
            axis.ticks = element_blank(),
            panel.grid.major = element_blank(),
            panel.grid.minor = element_blank() 
        ) +
        annotation_custom(leg1Grob, xmin=1, xmax=1, ymin=.95, ymax=1.3) +
        annotation_custom(leg2Grob, xmin=.6, xmax=.8, ymin=.75, ymax=1) 
    
    out <- arrangeGrob(noleg, legs, ncol=2, widths=c(.85, .15))
    print(out)
    

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多