我的问题是我想使用geom_tile
为我的热图提供不同的颜色,并且渐变颜色在比例尺的两端都不同。例如,整个比例为(-1,1),我只希望-1到-0.5的值,而0.5到1.0的值具有渐变的颜色变化,并且-0.5到0.5之间的值保持白色。但是我找不到scale_fill_gradient
中的选项来达到目标。可重现的示例如下,数据来自ggplot2 heatmaps: using different gradients for categories
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba$Name <- with(nba, reorder(Name, PTS))
library("ggplot2")
library("plyr")
library("reshape2")
library("scales")
nba.m <- melt(nba)
nba.s <- ddply(nba.m, .(variable), transform,
rescale = scale(value))
ggplot(nba.s, aes(variable, Name))+geom_tile(aes(fill = rescale), colour = "white") +
scale_fill_gradient(low = "darkgreen", high = "darkred")
最佳答案
您可以尝试在scale_fill_gradient2
中添加一个白色的中点:
gg <- ggplot(nba.s, aes(variable, Name))
gg <- gg + geom_tile(aes(fill = rescale), colour = "white")
gg <- gg + scale_fill_gradient2(low = "darkgreen", mid = "white", high = "darkred")
gg <- gg + labs(x="", y="")
gg <- gg + theme_bw()
gg <- gg + theme(panel.grid=element_blank(), panel.border=element_blank())
gg
但是,如果您遵循链接到的SO帖子中的答案并使用
scale_fill_gradientn
,则将具有最大的灵活性。编辑(以显示评论讨论中的示例)
# change the "by" for more granular levels
green_seq <- seq(-5,-2.000001, by=0.1)
red_seq <- seq(2.00001, 5, by=0.1)
nba.s$cuts <- factor(as.numeric(cut(nba.s$rescale,
c(green_seq, -2, 2, red_seq), include.lowest=TRUE)))
# find "white"
white_level <- as.numeric(as.character(unique(nba.s[nba.s$rescale >= -2 & nba.s$rescale <= 2,]$cuts)))
all_levels <- sort(as.numeric(as.character(unique(nba.s$cuts))))
num_green <- sum(all_levels < white_level)
num_red <- sum(all_levels > white_level)
greens <- colorRampPalette(c("#006837", "#a6d96a"))
reds <- colorRampPalette(c("#fdae61", "#a50026"))
gg <- ggplot(nba.s, aes(variable, Name))
gg <- gg + geom_tile(aes(fill = cuts), colour = "white")
gg <- gg + scale_fill_manual(values=c(greens(num_green),
"white",
reds(num_red)))
gg <- gg + labs(x="", y="")
gg <- gg + theme_bw()
gg <- gg + theme(panel.grid=element_blank(), panel.border=element_blank())
gg <- gg + theme(legend.position="bottom")
gg
图例远非理想,但您可以将其排除在外,也可以通过其他方法加以解决。
关于r - 如何使用scale_fill_gradient指定 "low"和 "high"并在两端获得两个音阶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387670/