首页 文章

ggplot2热图,带有远程值的颜色

提问于
浏览
24

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

任何帮助将受到高度赞赏 . 谢谢

2 回答

  • 18

    对于像这样的东西你有几种选择,但这里有一个作为起点 .

    首先,使用 cutY 创建具有适当范围的因子:

    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

    这个配色方案在低端比紫色更蓝,但它是我在Brewer调色板中找到的最接近的颜色 .

    如果你想构建自己的,你可以简单地使用 scale_fill_manual 并为 values 参数指定所需的颜色矢量 .

  • 40

    目前尚不清楚您是否需要离散颜色,或者您列出的颜色是否只是 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,"blue"在2,"lightblue"在1,"white"在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")
    

相关问题