ggplot делает диапазон цветовой шкалы подмножеством диапазона данных

Я пытаюсь изменить масштаб тепловой карты с geom_raster так, что изменение цвета происходит в подмножестве данных, и все, что находится вне этого подмножества, не становится более или менее красочным.

library(tidyverse)
library(viridis)
library(reshape2)

q <- letters[1:5]
w <- rev(letters)[1:5]
x1 <- rnorm(5, 0, 1)
x2 <- rnorm(5, 0, 1)
x3 <- rnorm(5, 0, 1)
x4 <- rnorm(5, 0, 1)
x5 <- rnorm(5, 10, 1)

test.df <- melt(data.frame(q,w,x1,x2,x3,x4,x5))

ggplot(test.df, aes(q,variable,fill=value))+geom_raster()+scale_fill_viridis()

Если вы запустите это, вы получите эту тепловую карту:

Тепловая карта,

В верхнем ряду "заусенцы" какой-то цветовой гаммы. Поскольку подавляющее большинство данных находится между -2 и 2, я хотел бы сделать так, чтобы изменение цветовой шкалы происходило в этом диапазоне, а все, что находится за его пределами, было просто желтым или фиолетовым. Для меня все, что больше 2, должно быть "очень высоким", а что-либо ниже -2 должно быть "очень низким", но я хочу видеть цифры от -2 до 2.

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

3 ответа

Вы можете использовать функцию, такую ​​как dplyr::case_when усечь значения в ваших конечных точках. Затем, если вы хотите, вы можете установить метки на легенде соответственно. Обратите внимание, что я набрал метки вручную, чтобы сделать "<= -2" а также ">= 2"; не уверен, что этого будет достаточно, или вам может понадобиться что-то более динамичное.

library(tidyverse)
library(viridis)
library(reshape2)

set.seed(1234)
q <- letters[1:5]
w <- rev(letters)[1:5]
x1 <- rnorm(5, 0, 1)
x2 <- rnorm(5, 0, 1)
x3 <- rnorm(5, 0, 1)
x4 <- rnorm(5, 0, 1)
x5 <- rnorm(5, 10, 1)

test.df <- melt(data.frame(q,w,x1,x2,x3,x4,x5)) %>%
  mutate(val_trimmed = case_when(
    value > 2 ~ 2,
    value < -2 ~ -2,
    T ~ value
  )) 

ggplot(test.df, aes(x = q, y = variable, fill = val_trimmed)) +
  geom_raster() +
  scale_fill_viridis(labels = c("<= -2", "-1", "0", "1", ">= 2"), breaks = -2:2) +
  labs(caption = "Note: values truncated above 2 and below -2")

Создано 2018-08-13 пакетом представлением (v0.2.0).

Если значения превышают шкалу только на одном конце (похоже, в случае с вашими данными, у вас есть значения больше 2, но не меньше -2), вы можете изменить значения, которые превышают ваш максимум, на NA в вашем фрейме данных, а затем использовать na.value = вариант в scale_fill_viridis() сделать все значения NA определенного цвета.

#change values greater than 2 to NA
test.df$value <- ifelse(test.df$value <= 2, test.df$value, NA)

ggplot(test.df, aes(q, variable, fill = value)) +
  geom_raster() +
  scale_fill_viridis(na.value = "yellow", #make NAs (values > 2) yellow
                     limits = c(-2,2), #define limits of scale
                     labels = c(as.character(-2:1), ">= 2"), breaks = -2:2)

Это решение менее гибкое, чем другие ответы, так как оно не будет работать, если у вас есть значения, которые превышают ваш диапазон на верхнем и нижнем уровнях шкалы, но это простой и краткий способ сделать это, если у вас есть только выбросы на один конец шкалы.

Ты можешь использовать scale_fill_gradientn иметь полный контроль над своим цветовым градиентом. Код ниже назначит разные цвета через [-2, 2] но сохранит цвет краев непротиворечивым за этими значениями. Пожалуйста, попробуйте установить семена в ваших вопросах, используя set.seed для воспроизводимости.

ggplot(test.df, aes(q, variable, fill = value)) + 
  geom_raster() + 
  scale_fill_gradientn(
    colours = c("blue", "blue", "red", "red"),
    values = c(-999, -2, 2, 999)
  )

Просто увеличьте количество цветов и значений, чтобы расширить цветовой градиент.

Другие вопросы по тегам