在scale_fill_stepsn中将ggplot的颜色刻度居中于零点

3

工作数据

m=raster(ncol=10,nrow=10)
m[,]=runif(100, -0.8, 0.5)
tmp=data.table(as.data.frame(m,xy=TRUE))
ggplot()+ geom_tile(data = tmp, aes(x = x, y = y ,fill=layer)) +
scale_fill_stepsn(colors=c('#b2182b','#ef8a62','#fddbc7','#f7f7f7','#d1e5f0','#67a9cf','#2166ac'),n.breaks=10)

然而,由于一些负数的存在,这并不以零为中心,它们是蓝色的。enter image description here 我正在尝试绘制多个图表,显示在-1到+1之间的数据,但是大多数图表的数据并没有围绕零居中,因为正数或负数的数据范围更大。在图表中,我希望正值以蓝色显示,负值以红色显示,并控制binnes为0.1或0.2间隔。
如何通过编程强制在scale_fill_stepsn中使颜色比例尺居中于零而不需要反复调整分界点?我尝试过玩n.breaks和scale_fill_steps2,但对颜色比例尺没有太多控制。

由于您的数据范围从-1到+1,一种选择是通过添加“limits=c(-1,1)”来固定限制。 - stefan
@stefan 谢谢,我已经澄清了每个图形的数据通常不会均匀地围绕零中心。大多数情况下都像示例一样。 - Herman Toothrot
1个回答

4

在我看来,以零为中心的对称比例尺可能是一个不错的解决方案。

library(raster)
library(data.table)
library(ggplot2)

set.seed(12345)
m <- raster(ncol=10,nrow=10)
m[,] <- runif(100, -0.8, 0.5)
tmp <- data.table(as.data.frame(m,xy=TRUE))
lmt <- ceiling(10*max(abs(range(tmp$layer))))/10

ggplot()+ 
  geom_tile(data = tmp, aes(x = x, y = y ,fill=layer)) +
  scale_fill_stepsn(colors=c('#b2182b','#ef8a62','#fddbc7',
                             '#f7f7f7','#d1e5f0','#67a9cf','#2166ac'),
             n.breaks=10, limits=c(-lmt,lmt), show.limits=T)

enter image description here


1
谢谢Marco,我认为这是一个非常优雅的解决方案,因此读者可以看到一个漂亮的对称图例。但是,使用您的方法,我可能也可以使用scale_fill_steps2。 - Herman Toothrot
1
@HermanToothrot 是的,在我看来,绘制相关性时建议使用对称比例尺。这样可以更正确地评估两个方向上关联的强度。 - Marco Sandri

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