首先,我不得不说,我在 stackoverflow 和其他地方读到了很多关于 heatmap 和 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
.....
Run Code Online (Sandbox Code Playgroud)
该值应该是颜色,并且右侧的图例会很好。
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)
Run Code Online (Sandbox Code Playgroud)
结果是:
我想要一个从红色=高到橙色、黄色、绿色、浅蓝色、深蓝色=低的“正常”彩虹比例,而不需要给出固定的离散颜色,例如使用scale_fill_gradient2。我想知道为什么“彩虹”以红色开头=高端以其他红色结尾......
另一个问题:如何添加一些东西来“平滑”热图,这样人们就不会到处看到“边缘”?
简短的回答:当你按照你的要求通过时,功能rainbow() 就会变得疯狂100100。
你应该做什么:传递n给rainbow()你想要多少种颜色。如果你想从蓝色变成红色,那么你还必须用 function 包装它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)
Run Code Online (Sandbox Code Playgroud)
编辑:
在 OP 指定他想要的颜色之后,传递十六进制向量应该可以工作:
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()
Run Code Online (Sandbox Code Playgroud)