【发布时间】: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 < 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参数接受一个函数。然后在内部为该函数提供x和range参数,其中oob_censor用NA替换越界值。如此有效,您的第一个解决方案执行您的第二个解决方案尝试执行的操作,因为oob_censor()是连续缩放的默认oob。您还可以将限制提供为c(20, NA),以将NA替换为数据的自然上限。 -
@teunbrand 非常感谢您花时间澄清!我这边马虎的 RTFM;自我注意:
oobonly 采用函数名称(并且 not 是带有参数的实际函数,就像我天真的尝试一样......)。干杯