R ggplot scale_fill_manual с использованием цветов для значений в пределах диапазона

Я просто надеюсь почистить свой код и кое-что узнать. Я чувствую, что делаю это более сложным, чем должно быть. У меня есть диапазон данных от 0 до 9, и я хотел бы указать цвет для значений в этом диапазоне. Например:

0-3 green
4-6 yellow
7-9 red

Это единственный способ, которым я смог заставить его работать. Я чувствую, что должен быть способ указать диапазоны в перерывах. т. е. 0-3 = зеленый и т. д.

ggplot() +
  geom_raster(data = data, aes(x = samples, y = organism, fill = as.factor(value))) +
  scale_fill_manual(values=c("green", "green", "green","green", "yellow","yellow","yellow", "red","red", "red"), breaks=c(0,1,2,3,4,5,6,7,8,9))

Следующий код работает нормально, но всякий раз, когда я пытаюсь создать диапазон внутри разрывов, я получаю сообщение об ошибке:

breaks=c(0-3,4-6,7-9)
Error: Insufficient values in manual scale. 10 needed but only 3 provided.

Я надеюсь, что это довольно понятно. При необходимости я могу предоставить образец набора данных (ниже). Спасибо за ваше время!

samples,organism,value
a,z,0
b,z,1
c,z,2
d,z,3
e,z,4
f,z,5
g,z,6
h,z,7
i,z,8
j,z,9

person Jakeeln    schedule 25.11.2020    source источник
comment
Всегда добавляйте данные, это помогает.   -  person Ronak Shah    schedule 25.11.2020


Ответы (1)


У меня нет ваших данных, но я сделал кое-что, похожее на ваше:

set.seed(123)
data <- expand.grid(samples = 1:5, organism = LETTERS[1:4])
data$value <- sample(0:9, 20, replace = TRUE)

С этими данными я получаю другую ошибку при запуске вашего кода:

ggplot() +
  geom_raster(data = data, aes(x = samples, y = organism, fill = value)) +
  scale_fill_manual(values=c("green", "green", "green", "green", "yellow", "yellow", "yellow", "red", "red", "red"), 
                    breaks=c(0,1,2,3,4,5,6,7,8,9))
Error: Continuous value supplied to discrete scale

Если я конвертирую value в множитель, я не получаю ошибки. Мне нужны ваши данные, чтобы помочь диагностировать ошибку.

ggplot() +
  geom_raster(data = data, aes(x = samples, y = organism, fill = factor(value))) +
  scale_fill_manual(values=c("green", "green", "green", "green", "yellow", "yellow", "yellow", "red", "red", "red"), 
                    breaks=c(0,1,2,3,4,5,6,7,8,9))

введите здесь описание изображения

Используя мои данные, вот более простой способ сделать это (особенно если value непрерывен):

ggplot() +
  geom_raster(data = data, aes(x = samples, y = organism, 
                               fill = cut(value, breaks = c(0, 3, 6, 9)))) +
  scale_fill_manual(name = "value", 
                    values = c("green", "yellow", "red"),
                    labels = c("0-3", "4-6", "7-9"))

введите здесь описание изображения

person Ben Norris    schedule 25.11.2020
comment
Спасибо за помощь! Я пояснил ошибку, которую я получил в вопросе. Использование функции вырезания было именно тем, что мне было нужно. Оглядываясь назад, я определенно должен был включить данные. Это было из огромного набора данных, но я мог бы добавить некоторые данные-заполнители. - person Jakeeln; 25.11.2020
comment
Одно дополнительное редактирование вашего решения, список вырезов должен быть c (-1,3, 6, 9) - person Jakeeln; 25.11.2020