【问题标题】:How to make all values below a threshold have single color with scale continuous?如何使低于阈值的所有值都具有单色且比例连续?
【发布时间】:2021-02-19 09:22:34
【问题描述】:

我想将一个变量映射到一个连续的色阶,但如果该值低于某个阈值,它应该具有特定的颜色。在这个例子中,我想让所有带有mpg < 20 的汽车模型都用灰色填充,上面的所有东西都用连续的色标:

library(ggplot2)
dat <- head(mtcars)
dat$model <- head(colnames(mtcars))
dat$is_low <- ifelse(dat$mpg < 20, TRUE, FALSE)

ggplot(dat, aes(x = model, y = mpg, fill = mpg)) +
    geom_col()

这可能吗?我见过的最接近的是solution,但它映射第二个变量到scale_color 而不是scale_fill_continuous

【问题讨论】:

  • 最简单的方法是指定fill = ifelse(mpg &lt; 20, NA, mpg)。您可以使用scale_fill_continuous(na.value = "green") 控制NA 值的颜色。
  • 如果你把它作为答案,我会投赞成票 :) 我还没有决定是使用你的还是@Jon Spring 解决方案,但这很棒!
  • 也许更简单:我认为您可以在scale_fill_continuous 中使用limits,例如:scale_fill_continuous(limits = c(20, max(dat$mpg)))。默认的越界(oob)参数是oob_censor(),它“用NA替换越界值”(这里是20以下的值),然后na.value开始了。我非常幼稚的理解的scales::oob_censor,让我认为scale_fill_continuous(oob = oob_censor(mpg, range = c(20, Inf))) 也可以工作。没有。 @teunbrand,假设您更了解此功能.. :)
  • 嗯,是的,我非常了解这个函数,因为我已经在 scale 包的 PR 中编辑了这个函数:) oob 参数接受一个函数。然后在内部为该函数提供xrange 参数,其中oob_censorNA 替换越界值。如此有效,您的第一个解决方案执行您的第二个解决方案尝试执行的操作,因为 oob_censor() 是连续缩放的默认 oob。您还可以将限制提供为c(20, NA),以将NA 替换为数据的自然上限。
  • @teunbrand 非常感谢您花时间澄清!我这边马虎的 RTFM;自我注意:oob only 采用函数名称(并且 not 是带有参数的实际函数,就像我天真的尝试一样......)。干杯

标签: r ggplot2


【解决方案1】:

不是最优雅的,但您可以添加一个过滤到您想要灰色的图层:

ggplot(dat, aes(x = model, y = mpg, fill = mpg)) +
  geom_col() +
  geom_col(data = dat[dat$is_low,], fill = "gray70")

【讨论】:

  • 效果很好。我将不得不看看我是否使用它或@teunbrand,这在某种程度上取决于我的真实用例的实现,但这非常好。我一直忘记在ggplot 中总是可以覆盖东西。
【解决方案2】:

添加第二层geom_col(),您可以将每个条形涂成灰色,或者如果它不符合您的标准则跳过。您可能还想更改第一层的着色比例限制。

ggplot(dat, aes(x = model, y = mpg, fill = mpg)) +
  geom_col() + geom_col(fill=ifelse(dat$mpg < 20, 'gray', NA))

【讨论】:

  • 实际上改变限制意味着超出范围的任何东西都是灰色的,所以只需添加+ scale_fill_continuous(limits=c(20,max(dat$mpg)))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2021-01-04
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多