【问题标题】:R: How to manually set binned colour scale in ggplot?R:如何在 ggplot 中手动设置分级色标?
【发布时间】:2021-05-02 22:51:18
【问题描述】:

我正在尝试为 ggplot 点图设置色标,划分区域:不合适、合适、理想、合适、不合适。在您的标准 ggplot 代码包装器中,我尝试过 gradient2

scale_colour_gradient2(low = "grey",
                       mid = "red",
                       high = "grey",
                       midpoint = 25) +

gradientn;

scale_colour_gradientn(colours = rev(rainbow(5)),
                       breaks = seq(0, 30, by = 5),
                       limits = c(0, 30),
                       labels = as.character(seq(0, 30, by = 5))) +

stepsn,

scale_colour_stepsn(colours = c("grey", "blue", "red", "blue", "grey"),
                    values = scales::rescale(c(0, 22, 25, 26, 29, 40))) +

binned

scale_colour_binned(type = "viridis",
                      breaks = c(22, 25, 26, 29),
                      limits = c(0, 40),
                      guide = guide_coloursteps(even.steps = FALSE,
                                                show.limits = TRUE)) +

binned 是最接近的,但我不知道如何指定我想要的 5 种颜色(即,不是 viridis)。我可能想要的“类型”的帮助选项是:

返回连续色标的函数

但鉴于我只想说(例如)

c("red", "yellow", "green", "yellow", "red")

我感觉要么我很接近并且只是在某个地方(可能是多个地方)误解了一个步骤,要么我使用了错误的方法,而这三个功能都不是。

任何人都可以提供建议吗?

谢谢大家!

编辑:按照 Will 的建议进行更新:保持 geom_point 调用中的值不变,即

geom_point(aes(colour = MeanETemp24hU2M), size = 0.5) +

(而不是将它们重新缩放为 0:1),以下代码:

scale_colour_stepsn(colours = c("red", "yellow", "green", "yellow", "red"),
                      limits = c(0, 40),
                      guide = guide_coloursteps(even.steps = FALSE,
                                                show.limits = TRUE),
                      breaks = c(0, 22, 25, 26, 29, 40)) +

生产:

很接近但是

A. colours 向量与 breaks 箱不匹配

B.颜色本身是混合色,而不是真正的 R 颜色。使用 Will 示例的修改:

x <- 1:100
y <- runif(100) * 100
tibble(x, y) %>% 
  ggplot() +
  aes(x = x, y = y, color = y) +
  geom_point() +
  scale_color_stepsn(
    colours = c("red", "yellow", "green", "yellow", "red"),
    breaks = c(0, 0.2, 0.4, 0.6, 0.8, 1) * 100)

生产:

这些值是正确的并且与颜色箱正确对齐(IDK 为什么我的没有给出相同的配方),但是颜色是稀释的混合 - 将该图像中的红色与彩虹末端的红色进行比较第二张图片。

【问题讨论】:

  • 如果您不一定想要颜色之间的渐变,您可以考虑在数据框中添加一列,根据不合适、合适、理想来定义合适性,然后根据此因素着色?
  • 可爱、优雅的解决方案 Will,不错。仍然会在概念上对是否有符合我尝试的正确解决方案感兴趣,但我想当我明天回到这个问题时,我会选择你的解决方案。干杯!

标签: r ggplot2 colors scale


【解决方案1】:

我正试图做到这一点,并找到了binned_scale 的方法,这就是scale_color_stepsn 所调用的。我将使用与 Will 类似的示例,希望您能将其转化为您的案例。

palette 参数仍然需要是一个函数,但您可以使用一个简单地返回所需颜色的函数。这里我展示了你可以使用不规则的中断,如果你想使用show.limits = TRUE,可以单独指定限制(否则它会在你的数据集中显示限制)。

x <- 1:100
y <- runif(100) * 100
tib <- tibble(x, y)

ggplot(tib, aes(x = x, y = y, color = y)) +
  geom_point() +
  binned_scale(aesthetics = "color",
               scale_name = "stepsn", 
               palette = function(x) c("red", "yellow", "green", "yellow", "red"),
               breaks = c(5, 10, 25, 60),
               limits = c(0, 100),
               show.limits = TRUE, 
               guide = "colorsteps"
  )

在这里,guide = "colorsteps" 需要在图例中填充正方形。如果您希望图例中的比例条与even.steps = FALSE 一样,则需要改用guide = "colorbar"

【讨论】:

  • 好东西@Goine0!我注意到你使用了 4 次休息 + 2 次限制,而我的 6 次休息......我想知道这是否是让你的颜色无法像我的那样混合的原因?当我下次回到我的主机时,我会尝试测试这个。干杯!
  • 不,颜色分配不同,因为调色板。 TBH,这有点像黑客,我不认为它是为了这种用途而设计的。 show.limits = TRUE 的 6 次中断没有按预期工作,所以这就是我必须单独指定限制的原因。整个事情有点冗长,但可以做到你想要的。
【解决方案2】:

看起来你很接近scale_color_stepsn,如果你将你的 rescale 参数传递给breaks,它可能会起作用。我认为以下内容符合您的期望?

library(tidyverse)

x <- 1:100
y <- runif(100)
tibble(x, y) %>% 
  ggplot() +
  aes(x = x, y = y, color = y) +
  geom_point() +
  scale_color_stepsn(
    colours = c("red", "yellow", "green", "yellow", "red"),
    breaks = c(0, 0.2, 0.4, 0.6, 0.8, 1)
  )

可以替换scale_color_gradientn,漂亮多了!

scale_color_gradientn(
    colours = c("red", "yellow", "green", "yellow", "red"),
    breaks = c(0, 0.2, 0.4, 0.6, 0.8, 1)

编辑:

重新缩放问题肯定会导致问题。我认为这个解决方案适用于scales_color_gradientn。注意我把测试数据框改了一点。

library(tidyverse)

x <- seq(0, 40, 0.25)
y <- seq(0, 40, 0.25)
tibble(x, y) %>% 
  ggplot() +
  aes(x = x, y = y, color = y) +
  geom_point() +
  scale_color_gradientn(
    colours = c("red", "yellow", "green", "yellow", "red"),
    values = scales::rescale(c(0, 22, 25, 26, 29, 40))
  )

我多次尝试使用scales_color_stepsn 获得一些不错的效果,但正如您所见,此函数似乎在中断处分配“纯”颜色并合并它们之间的值的颜色(我无法了解其他一些不寻常的行为,例如颜色乱序等)。我认为,如果您想要纯红色/黄色/绿色的阶梯式渐变,我最初的评论可能是最好的方法 - 在您的数据框中分配一个值以将颜色映射到。上面代码中的图例具有均匀间隔的标签,如果您想标记中断,请将breaks = c(0, 22, 25, 26, 29, 40) 添加到参数中,尽管我发现很难以这种方式阅读标签。 HTH。

【讨论】:

  • 再次感谢威尔。就目前的情况而言,第一个代码部分并不令人高兴——所有的点都是绿色的。也许我遗漏了一些东西,但你应该在任何地方明确地包括重新调整吗? [编辑:runif 不需要]。我尝试重新调整休息时间,但它什么也没做。省略“值”也可能是传说消失的原因。 gradientn 看起来很接近,但颜色是错误的(“理想”区域中的红色)并且与您的中断或重新调整的原始值相同,这看起来很奇怪。我很接近 stepn,但奇怪的是颜色的顺序很奇怪,我不知道为什么(在 Q 中更新)
  • 用不同的方法更新了我的答案。 HTH。
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2021-01-09
  • 2018-07-14
  • 2015-10-09
相关资源
最近更新 更多