如何指定“低”和“高”并使用scale_fill_gradient在两端获得两个刻度

我的问题是我希望使用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,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,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="",panel.border=element_blank())
gg <- gg + theme(legend.position="bottom")
gg

传说远非理想,但您可以通过其他方式排除它或解决它.

相关文章

Css3如何实现鼠标移上变长特效?(图文+视频)
css3怎么实现鼠标悬停图片时缓慢变大效果?(图文+视频)
jquery如何实现点击网页回到顶部效果?(图文+视频)
css3边框阴影效果怎么做?(图文+视频)
css怎么实现圆角边框和圆形效果?(图文+视频教程)
Css3如何实现旋转移动动画特效