11

在以下示例中,我创建了两个点系列并使用ggplot2. 我还根据他们的价值观强调了几点

library(ggplot2)
x <- seq(0, 6, .5)
y.a <- .1 * x -.1
y.b <- sin(x)
df <- data.frame(x=x, y=y.a, case='a')
df <- rbind(df, data.frame(x=x, y=y.b, case='b'))
print(ggplot(df) + geom_point(aes(x, y), color=ifelse(df$y<0, 'red', 'black')))

这是结果

第一个结果

现在我想将两个cases 分成两个方面,保持突出显示方案

> print(ggplot(df) + geom_point(aes(x, y), color=ifelse(df$y<0, 'red', 'black')) + facet_grid(case ~. ,))
Error: Incompatible lengths for set aesthetics: colour

如何实现?

4

2 回答 2

26

您应该放在color=ifelse(y<0, 'red', 'black'),aes()所以颜色将根据每个方面的 y 值独立设置。如果在 aes() 之外将颜色设置为向量,则在两个方面都使用相同的向量(具有相同的长度),然后您会得到错误,因为颜色向量的长度随着数据点的数量而变大。

然后您应该添加scale_color_identity()以确保直接解释颜色名称。

ggplot(df) + geom_point(aes(x, y, color=ifelse(y<0, 'red', 'black'))) + 
   facet_grid(case ~. ,)+scale_color_identity()

在此处输入图像描述

于 2013-04-04T07:02:07.343 回答
3

除了使用 scale_..._identity,还可以将颜色(和填充)美学包装​​在I(). 它还需要在 中定义颜色aes

我遇到了这个问题,我猜我不小心使用了 OP I()... ggplot 颜色不会根据组自动着色

不确定我是否会利用它,但我觉得这种乐趣。

library(ggplot2)
x <- seq(0, 6, .5)
y.a <- .1 * x -.1
y.b <- sin(x)
df <- data.frame(x=x, y=y.a, case='a')
df <- rbind(df, data.frame(x=x, y=y.b, case='b'))

ggplot(df) + 
  geom_point(aes(x, y, color= I(ifelse(y < 0, 'red', 'black')))) +
  facet_grid(case ~. )

reprex 包于 2020-07-01 创建(v0.3.0)

于 2020-07-01T12:54:45.803 回答