【问题标题】:Fill and Color Legend Disappear while Adding Layers添加图层时填充和颜色图例消失
【发布时间】:2020-05-28 06:45:53
【问题描述】:

我在 ggplot 对象中更改图层时发现了一个意外行为。我从一个初始情节开始。

library(ggplot2)

p <-
  ggplot(iris, aes(x = Sepal.Length, y =  Sepal.Width, color = Petal.Width, size = Petal.Length)) + 
  geom_point() +
  scale_x_continuous(position = 'top') +
  scale_size_area('Size Name', max_size = 12) +
  scale_color_gradientn(
    'Color Name',
    colors = scales::brewer_pal(type = 'div')(7),
    limits = c(-3, 3),
    breaks = c(-3,  -1.5, 0 , 1.5, 3)
  ) 

print(p)

然后我决定将点图层更改为具有不同形状 21 的点图层。形状 21 具有填充而不是颜色。但是,我想保持其他一切不变。为了节省打字,我首先删除了初始点图层,然后添加了新的图层。但是,我发现填充的图例在应该显示的时候没有显示。


p$layers
#> [[1]]
#> geom_point: na.rm = FALSE
#> stat_identity: na.rm = FALSE
#> position_identity



p$layers[[1]] <- NULL


p_with_name <-
  p + 
  geom_point(aes(fill = Petal.Width), shape = 21, color = 'black') +
  scale_fill_gradientn(
    'Color Name',
    colors = scales::brewer_pal(type = 'div')(7),
    limits = c(-3, 3),
    breaks = c(-3,  -1.5, 0 , 1.5, 3)
  )

print(p_with_name)

但是,当我添加没有标题的填充比例时,或者使用与颜色比例不同的标题时,它会正确显示。

p_no_name <-
  p + 
  geom_point(aes(fill = Petal.Width), shape = 21, color = 'black') +
  scale_fill_gradientn(
    colors = scales::brewer_pal(type = 'div')(7),
    limits = c(-3, 3),
    breaks = c(-3,  -1.5, 0 , 1.5, 3)
  )

print(p_no_name)


p_diff_name <-
  p + 
  geom_point(aes(fill = Petal.Width), shape = 21, color = 'black') +
  scale_fill_gradientn(
    'Diff Name',
    colors = scales::brewer_pal(type = 'div')(7),
    limits = c(-3, 3),
    breaks = c(-3,  -1.5, 0 , 1.5, 3)
  )

print(p_diff_name)


Created on 2020-05-28 by the reprex package (v0.3.0)

是否可以添加与色标同名的填充标尺并让它出现?这将帮助我大大简化我的代码。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    默认情况下,ggplot2 尝试通过合并具有相同名称的图例来最小化图例的数量,以实现不同的美学,...。经过一些试验,我发现了一种防止传说合并的技巧,并且有两个“相同”的具有相同名称的传说。我只是将NA 添加到scale_fill_gradientn 中的中断向量中,这会破坏颜色和填充比例的标识并防止图例被合并。试试这个:

    library(ggplot2)
    
    ggplot(iris, aes(x = Sepal.Length, y =  Sepal.Width, color = Petal.Width, size = Petal.Length)) + 
      geom_point() +
      scale_x_continuous(position = 'top') +
      scale_size_area('Size Name', max_size = 12) +
      scale_color_gradientn(
        'Color Name',
        colors = scales::brewer_pal(type = 'div')(7),
        limits = c(-3, 3),
        breaks = c(-3,  -1.5, 0 , 1.5, 3)
      ) + 
      geom_point(aes(fill = Petal.Width), shape = 21, color = 'black') +
      scale_fill_gradientn(
        'Color Name',
        colors = scales::brewer_pal(type = 'div')(7),
        limits = c(-3, 3),
        breaks = c(-3,  -1.5, 0 , 1.5, 3, NA)
      )
    

    reprex package (v0.3.0) 于 2020 年 5 月 28 日创建

    编辑:问题的“干净”解决方案

    # clean solution
    p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, size = Petal.Length)) + 
      scale_x_continuous(position = 'top') +
      scale_size_area('Size Name', max_size = 12)
    
    p +
      geom_point(aes(color = Petal.Width))  +
      scale_color_gradientn(
        'Color Name',
        colors = scales::brewer_pal(type = 'div')(7),
        limits = c(-3, 3),
        breaks = c(-3,  -1.5, 0 , 1.5, 3) 
      )
    
    p + 
      geom_point(aes(fill = Petal.Width), color = "black", shape = 21)  +
      scale_fill_gradientn(
        'Color Name',
        colors = scales::brewer_pal(type = 'div')(7),
        limits = c(-3, 3),
        breaks = c(-3,  -1.5, 0 , 1.5, 3)
      )
    

    【讨论】:

    • 问题是我想合并秤并共享相同的标题。问题是,当他们应该是,他们不是。我认为当我使用与色标相同的名称传递填充比例时,它会尝试合并并失败。当我给它一个不同的标题时,它会单独绘制填充比例,所以它会出现。
    • 没关系,我明白你在说什么。我可以通过在中断黑客中使用 NA 来传递具有相同标题的填充比例并且不尝试合并(并随后失败)。这是我的情况的解决方案,但我想相信有一种更优雅的方式来实现这一点。
    • 好的。我懂了。又看了一眼。据我所知,问题的出现是因为您将具有填充美学的情节的颜色设置为“黑色”。无法告诉您到底出了什么问题,但我的猜测是,这与您全局指定连续颜色图例/美学的事实有关,然后将颜色设置为离散值,这会破坏图例的合并。删除color="black" 工作正常。我在我的代码中添加了一个编辑,这可能是一个更干净的解决方案,并且带有任何黑客攻击。
    • 在我的“实时”代码中删除 color = "black" 不幸的是没有用,尽管在我这篇文章的示例代码中它确实有效。 :/ 我对你帮助我的事情很满意,但是这很烦人。
    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    相关资源
    最近更新 更多