【问题标题】:Changing scale legend label after creation in ggplot2在 ggplot2 中创建后更改比例图例标签
【发布时间】:2020-02-16 17:26:28
【问题描述】:

假设我有这样一个函数:

library(tidyverse)
#autoplotter
scatterplot = function(data, x, y, z) {
  ggplot(data, aes(!!as.symbol(x), !!as.symbol(y), color = !!as.symbol(z))) +
    geom_point() +
    scale_color_gradient2(low = "blue", 
                         high = "red", 
                         mid = "white", 
                         midpoint = 0, 
                         limit = c(-1, 1), 
                         space = "Lab", 
                         name = "Default label")
}

然后我们可以在一些数据上调用它:

#default
mpg %>% 
  mutate(z = runif(n(), min = -1, max = 1)) %>% 
  scatterplot("displ", "cyl", "z")

但是,如果我们想要另一个色标标签而不更改渐变设置怎么办?不能只使用labs()

mpg %>% 
  mutate(z = runif(n(), min = -1, max = 1)) %>% 
  scatterplot("displ", "cyl", "z") +
  labs(color = "new label")

这不会改变任何事情,因为 labs() 显然无法覆盖函数中的 scale_color_gradient2()

我们可以覆盖比例,但这会重置配色方案:

mpg %>% 
  mutate(z = runif(n(), min = -1, max = 1)) %>% 
  scatterplot("displ", "cyl", "z") +
  scale_color_gradient2("new label")

我觉得这应该是可能的,要么通过指定ggplot2应该只更新label参数,要么使用ggplot2::ggplot_build()直接改变label参数,然后重建绘图。但是我在对象中找不到色标的标签值。太难搜索了,但它应该在某个地方!

【问题讨论】:

  • 为什么不给scatterplot 函数添加一个额外的参数?
  • 在某些情况下,函数是包的一部分,所以改变它的定义不太实用。
  • 你对我的回答投了反对票吗?为什么?
  • 是的。它没有解决专门关于修改对象而不是更改功能的问题。 StupidWolf 提供了正确答案。
  • 我认为这对你来说是不公平的。我的回答为您正在寻找的内容提供了一个有效的选择。在我看来,你没有把问题说得足够清楚,也可以对你的反对票发表评论,以便让我有机会改变我的答案。

标签: r ggplot2


【解决方案1】:

您可以使用guidesguide_colourbar

p <- mpg %>% 
  mutate(z = runif(n(), min = -1, max = 1)) %>% 
  scatterplot("displ", "cyl", "z")
p + guides(color=guide_colorbar(title="new label"))

【讨论】:

    【解决方案2】:

    最简单的方法是在散点图函数中添加一个额外的参数,即... 如果您不添加名称,您的图例名称将默认为您的颜色变量名称。

    library(tidyverse)
    #autoplotter
    scatterplot = function(data, x, y, z, ...) {
      ggplot(data, aes(!!as.symbol(x), !!as.symbol(y), color = !!as.symbol(z))) +
        geom_point() +
        scale_color_gradient2(low = "blue", 
                              high = "red", 
                              mid = "white", 
                              midpoint = 0, 
                              limit = c(-1, 1), 
                              space = "Lab", ...) #note those three guys here
    }
    
    mpg %>% 
      mutate(z = runif(n(), min = -1, max = 1)) %>% 
      scatterplot("displ", "cyl", "z")
    

    
    mpg %>% 
      mutate(z = runif(n(), min = -1, max = 1)) %>% 
      scatterplot("displ", "cyl", "z", name = 'new_label')
    

    reprex package (v0.3.0) 于 2020-02-16 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 2011-05-04
      • 2018-11-20
      • 2021-01-02
      • 2011-11-11
      • 1970-01-01
      相关资源
      最近更新 更多