在下面的示例中,我创建了两个点系列并使用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')))
这是结果
现在我想将两个case
分成两个方面,保持突出显示方案
> 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
如何实现这一目标?
答案 0 :(得分:15)
您应该将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()
答案 1 :(得分:0)
除了使用scale _..._ identity,还可以在I()
中包装颜色(并填充)美观。它还需要在aes
中定义颜色。
我遇到了一个问题,我猜想OP是偶然使用I()
... ggplot color is not automatically coloring based on group
不确定我会不会每个人都利用它,但是我发现这种乐趣。
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 package(v0.3.0)于2020-07-01创建