我想在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
任何帮助都将受到高度赞赏。感谢
答案 0 :(得分:43)
目前尚不清楚您是否需要离散颜色,或者您列出的颜色只是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")
如果你想要对颜色进行精细的细节控制,那么映射是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")
答案 1 :(得分:20)
你可以选择这样的方法,但这里有一个选择。
首先,使用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")
这个配色方案在低端比紫色更蓝,但它是我在Brewer调色板中找到的最接近的。
如果您想构建自己的,可以使用scale_fill_manual
并为values
参数指定所需的颜色矢量。