连续彩虹色热力图

6

首先,我必须说我在StackOverflow和其他地方阅读了许多关于热图和ggplot2的线程。但我的问题还没有解决。

我有以下数据集:

   Var1   Var2 value
1 -197.5 -197.5     0
2 -192.5 -197.5     0
3 -187.5 -197.5     0
4 -182.5 -197.5     0
5 -177.5 -197.5     0
6 -172.5 -197.5     0
.....

该值应为颜色,右侧应有图例。
library(ggplot2)
ggheatmap <- ggplot(data = dat.plot, aes(x=Var1, y=Var2, fill=value)) + 
  geom_raster()+
  scale_fill_gradientn(colours=rainbow(100))+
  theme(axis.text.x = element_text(angle = 0))+ 
  coord_fixed()
print(ggheatmap)

结果如下:

结果是:

图/热力图

我想要一个“普通”的彩虹色标尺,从红色=高到橙色、黄色、绿色、浅蓝色、深蓝色=低,而不是像使用scale_fill_gradient2这样固定离散颜色。 我想知道为什么“彩虹”开始是红色=高点,结束时是另一种红色......

另一个问题是:如何添加一些“平滑”,使得热力图的“边缘”不那么明显?


不回答你的问题,但请不要使用“彩虹”这个词。在此链接 https://www.climate-lab-book.ac.uk/2014/end-of-the-rainbow/ 和此视频 https://www.youtube.com/watch?v=xAoljeRJ3lU 中了解更多信息。 - Tung
好的,我明白了,但问题是我想将我的输出与另一款使用彩虹调色板的软件进行比较。我不明白的是(请参见此处的图像:https://www.climate-lab-book.ac.uk/2014/end-of-the-rainbow/),为什么彩虹从蓝色到红色。如果您看一下我的图例,即使您使用rev(...),比例尺也以另一种红色,粉色开始,然后是蓝色。这有点奇怪,为什么它被称为“彩虹”呢?或者我想错了吗? - Markus
3个回答

7

简短回答:当你传递100时,函数rainbow()会“失控”,因为它会生成100种不同的颜色。

应该怎么做:向rainbow()传递n以指定你需要多少种颜色。如果你想从蓝色到红色过渡,还需使用rev()函数进行包装。

library(egg)
library(ggplot2)
library(reshape2)

# Heatmap number of rows/columns
Nvalue <- 1e2
# n for colors passed to function rainbow
nColor <- c(1:10, seq(20, 100, 20))
# dummy data
df <- melt(matrix(rnorm(N^2), N))

plotList <- list()
for(i in seq_along(nColor)) {
    plotList[[i]] <- ggplot(df, aes(Var1, Var2, fill = value)) + 
        geom_raster() +
        scale_fill_gradientn(colours = rev(rainbow(nColor[i]))) +
        labs(title = paste0("rainbow(", nColor[i], ")"),
             x = NULL,
             y = NULL,
             fill = NULL) +
        theme_void()
}

ggarrange(plots = plotList)

在这里输入图片描述

编辑:

根据提问者指定的颜色,传递十六进制向量应该有效:

hex <- c("#FF0000", "#FFA500", "#FFFF00", "#008000", "#9999ff", "#000066")
ggplot(df, aes(Var1, Var2, fill = value)) + 
        geom_raster() +
        scale_fill_gradientn(colours = rev(hex)) +
        labs(x = NULL,
             y = NULL,
             fill = NULL) +
        theme_void()

enter image description here


是的,非常感谢。三种颜色会更好,但我喜欢将红色=最高值,橙色,黄色,绿色,浅蓝色和深蓝色用于零值。所以我认为我应该手动完成它。 关于我的第二个问题:如何平滑/插值热图的颜色? - Markus
1
要使颜色“平滑”,请在geom_raster中使用参数interpolate=TRUE,但是如果您的颜色比例尺有太多非常不同的颜色,则效率不高。 - Vincent Guillemot

4

用复杂的颜色比例尺插值颜色的问题最好在“老忠实”数据上进行说明。

如果使用自定义的“彩虹”颜色比例尺,插值效果可能不太理想(即使结果看起来还不错)。

不进行插值:

library(ggplot2)
cols <- rev(rainbow(7)[-7])

ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density), interpolate = FALSE) +
  scale_fill_gradientn(colours = cols)

没有插值

使用插值

ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density), interpolate = TRUE) +
  scale_fill_gradientn(colours = cols)

在插值和简化色板的情况下

使用插值和较简单的调色板

ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density), interpolate = TRUE) +
  scale_fill_gradientn(colours = c("steelblue", "tomato"))

Two color palette


0
ggheatmap <- ggplot(data = dat.plot, aes(x=Var1, y=Var2, fill=value)) + 
  geom_raster(interpolate=TRUE)+
  scale_fill_gradientn(colors=rev(c("darkred", "red", "orange", "yellow",    "green", "lightgreen", "lightblue", "darkblue")))+
  theme(axis.text.x = element_text(angle = 0))+ 
  coord_fixed()
print(ggheatmap)

现在看起来有点模糊,但没关系。如果您认为无法更好地处理它,我就保持原样了。非常感谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接