ggplot geom_point(),颜色基于特定的离散值

ter*_*don 19 r graph ggplot2

我试图为三个值范围绘制三种不同颜色的数据点.例如:

library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(colour = qsec))
Run Code Online (Sandbox Code Playgroud)

以上产生:

在此输入图像描述

现在,我想修改它,使qseq值<17为黑色,17到19之间的值为黄色,高于19的值为红色.我尝试了各种方法,但似乎没有一种方法可行:

  • 取自这里

    ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(fill = qsec)) + 
    scale_fill_gradientn(colours=c("black","yellow","red"), 
    breaks=c(0,17,19), labels=format(c("0","17","19")))
    
    Run Code Online (Sandbox Code Playgroud)

    这会产生:

    在此输入图像描述

    因此,颜色条似乎是正确的,但实际上并未应用颜色.

  • ggplot2热图中给出的解决方案颜色为远程值的解决方案看起来很有希望,但我无法使用它们geom_point().

  • 各种类似的帖子也是如此,例如侧栏中列出的帖子.

我意识到我可能需要使用某种离散比例而不是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.
Run Code Online (Sandbox Code Playgroud)

我猜我会以某种方式使用cut()factor()但我似乎无法弄清楚如何.有什么建议?

Rol*_*and 29

您需要将cut您的值放入间隔:

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"))
Run Code Online (Sandbox Code Playgroud)

结果情节