Подтвердить что ты не робот

Ggplot geom_point() с цветами на основе конкретных дискретных значений

Я пытаюсь построить точки данных с тремя разными цветами для трех диапазонов значений. Например:

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_gradientn(colours=c("black","yellow","red"), 
    breaks=c(0,17,19), labels=format(c("0","17","19")))
    

    Это дает:

    enter image description here

    Итак, цветная панель кажется правильной, но цвета на самом деле не применяются.

  • Решения, представленные в ggplot2 heatmap с цветами для значений дальности, кажутся многообещающими, но я не могу заставить их работать с 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.

Я предполагаю, что мне как-то придется использовать cut() или factor(), но я не могу понять, как это сделать. Любые предложения?

4b9b3361

Ответ 1

Вам нужно 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"))

resulting plot