使用基于特定离散值的颜色进行ggplot geom_point()操作

34

我希望绘制三个不同颜色的数据点来表示三个值范围。例如:

library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(colour = qsec))

上述代码会生成以下内容:

enter image description here

现在,我想将它修改成这样:qseq 值小于 17 的文本颜色为黑色,17 到 19 之间的值为黄色,大于 19 的值为红色。我尝试了各种方法,但似乎都不起作用:

  ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(fill = qsec)) + 
  scale_fill_gradient(colours = c("black","yellow","red"), 
  breaks=c(0,17,19), labels = format(c("0","17","19")))

这将生成:

enter image description here

所以,色条似乎是正确的,但实际上并没有应用颜色。

我意识到我可能需要使用某种离散比例尺来代替scale_fill_gradientn,但我尝试使用scale_color_manual()失败了:

ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(color = factor(qsec))) + 
scale_color_manual(values=c("black", "yellow","red")
Error: Insufficient values in manual scale. 30 needed but only 4 provided.

我猜我得以某种方式使用cut()或者factor(),但我似乎无法想出如何做。有什么建议吗?

1个回答

49

您需要将值 划分 到区间内:

library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) + 
  geom_point(aes(colour = cut(qsec, c(-Inf, 17, 19, Inf))),
             size = 5) +
  scale_color_manual(name = "qsec",
                     values = c("(-Inf,17]" = "black",
                                  "(17,19]" = "yellow",
                                  "(19, Inf]" = "red"),
                     labels = c("<= 17", "17 < qsec <= 19", "> 19"))

resulting plot


嗨@roland,这个scale_color_manual设置能在geom_line中运行吗? - pacomet
所有映射了颜色的几何图形都会应用颜色比例尺。 - Roland
我尝试根据我的数据调整您的代码,但没有成功。我需要的是根据y的值为单个geom_line()着色。这张图片(https://www.dropbox.com/s/du6fjvr71vybhuu/Rplot.png?dl=0)展示了我所需的效果。也许我应该发一个问题。 - pacomet
1
是的,你应该这样做。看起来 geom_line 并不是你需要的正确几何图形类型,也许你需要使用 geom_segment - Roland
不认为 geom_segment 会运行。图形来自于 geom_smooth。我要问一个问题。谢谢。 - pacomet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接