r - 如何使用scale_fill_gradient指定 "low"和 "high"并在两端获得两个音阶

标签 r colors ggplot2 scale heatmap

我的问题是我想使用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/

相关文章:

mysql - 如何在 r 中执行 MySQL 更新查询

r - sjPlot - 将绘图线颜色更改为黑色/白色

r - 字符串中的总和数 (R)

java - JProgressbar:如何根据进度改变颜色?

r - 如何从线性模型的 coef/model.matrix 返回中手动获取 predict() 值

java - 以编程方式查找相似的颜色

r - 与实际值相比,离散轴刻度和标签发生了偏移

r - 在使用 R、Sweave 和 knitr 的动态报告中使用的绘图中的 Unicode 字符

r - ggplot 中不同列值并排放置的多个箱线图

c++ - 如何为 editline 应用程序的提示着色