具有范围值颜色的 ggplot2 热图
Posted
技术标签:
【中文标题】具有范围值颜色的 ggplot2 热图【英文标题】:ggplot2 heatmap with colors for ranged values 【发布时间】:2012-06-14 10:19:20 【问题描述】:我想在 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")
这种配色方案在低端比蓝色更偏紫色,但它是我能在啤酒调色板中找到的最接近的配色。
如果您想构建自己的,只需使用 scale_fill_manual
并为 values
参数指定所需的颜色向量。
【讨论】:
感谢@joran 的回复。我想知道如何清除绘图的两个矩形之间的线条。谢谢 @MYaseen208 在geom_tile
中设置colour = "transparent"
。【参考方案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")
如果您想要对颜色进行精细的细节控制,例如映射在 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")
【讨论】:
感谢@Brian 的好回答。你是 ggplot2 的向导。非常感谢您的帮助。 有趣的是,尽管有 40 个赞成票,但当我复制并粘贴 Brian 的 scale_fill_manual 方法时,它只是无法正常工作,如图所示。 @Aguscamacho 您收到任何错误消息了吗?我收到一条非常明确的错误消息,指出“[”是字符串中无法识别的转义符。删除手册breaks
定义中的\
有效。看到答案是六年前,代码似乎很可能在六年前就可以工作,但是已经被 R 或 ggplot2 或其他任何东西的一些更新破坏了。以上是关于具有范围值颜色的 ggplot2 热图的主要内容,如果未能解决你的问题,请参考以下文章