31

我想在 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
4

2 回答 2

47

目前尚不清楚您是否需要离散颜色,或者您列出的颜色是否只是范围内的标记Y。我会展示两者。

对于离散的颜色,使用Y1joran 定义它

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")

于 2012-07-20T18:38:01.163 回答
27

对于这样的事情,您有多种选择,但这里有一个作为起点。

首先,用于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

于 2012-06-11T14:42:16.570 回答