Ggplot2 heatmap с цветами для значений диапазона
Я хочу сделать тепловую карту в ggplot2. Мои данные и код моей игрушки:
set.seed(12345)
dat <-
data.frame(
Row = rep(x = LETTERS[1:5], times = 10)
, Col = rep(x = LETTERS[1:10], each = 5)
, Y = rnorm(n = 50, mean = 0, sd = 1)
)
library(ggplot2)
p <- ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y), colour = "white") +
scale_fill_gradient(low = "white", high = "steelblue")
p
Я хочу иметь цветовую схему для значений диапазона:
-3 <= Y < -2 ---> Dark Blue
-2 <= Y < -1 ---> Blue
-1 <= Y < 0 ---> Light Blue
0 <= Y < 1 ---> Light Green
1 <= Y < 2 ---> Green
2 <= Y <= 3 ---> Dark Green
Любая помощь будет высоко оценена. Благодаря
Ответы
Ответ 1
У вас есть несколько вариантов для чего-то вроде этого, но вот один из них является отправной точкой.
Сначала используйте cut
, чтобы создать коэффициент из Y
с соответствующими диапазонами:
dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE)
Затем построим палитру из RColorBrewer:
ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y1), colour = "white") +
scale_fill_brewer(palette = "PRGn")
![enter image description here]()
Эта цветовая схема более фиолетовая, чем синяя на нижнем конце, но она наиболее близка к палитре пивоваров.
Если вы хотите создать свой собственный, вы можете просто использовать scale_fill_manual
и указать желаемый вектор цветов для аргумента values
.
Ответ 2
Не ясно, хотите ли вы дискретные цвета или если цвета, которые вы перечисляете, являются только маркерами в диапазоне от Y
. Я покажу оба.
Для дискретных цветов используйте Y1
, поскольку joran определяет его
dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE)
Затем вы можете получить сюжет с конкретными цветами, которые вы перечисляете, используя ручной шкалу
p <- ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y1)) +
scale_fill_manual(breaks=c("\[-Inf,-3)", "\[-3,-2)", "\[-2,-1)",
"\[-1,0)", "\[0,1)", "\[1,2)",
"\[2,3)", "\[3, Inf)"),
values = c("white", "darkblue", "blue",
"lightblue", "lightgreen", "green",
"darkgreen", "white"))
p
![]()
Я не знал, что вы хотели для цветов за пределами -3 и 3, поэтому я использовал белый цвет.
Если вам нужен непрерывный цвет, переход от синего на отрицательный до белого с 0 до зеленого на положительном, scale_fill_gradient2
будет работать.
ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y)) +
scale_fill_gradient2(low="darkblue", high="darkgreen", guide="colorbar")
![enter image description here]()
Если вам нужен тонкий контроль над цветом, так что отображение "darkblue" на 3, "синий" на 2, "светло-синий" на 1, "белый" на 0 и т.д., тогда scale_fill_gradientn
будет работать для вас:
library("scales")
ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y)) +
scale_fill_gradientn(colours=c("darkblue", "blue", "lightblue",
"white",
"lightgreen", "green", "darkgreen"),
values=rescale(c(-3, -2, -1,
0,
1, 2, 3)),
guide="colorbar")
![]()