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)
)
Просто увеличьте количество цветов и значений, чтобы расширить цветовой градиент.