在scale_gradient2中的非对称颜色分布?

23

修改scale_fill_gradient2的上限也会影响到值< 0的颜色缩放,因为围绕0的颜色分布似乎总是对称的,有没有一种方法可以获得不对称的颜色值分布?

下面是使用geom_tile()绘制图形的最小示例:

data <- read.csv("http://protzkeule.de/data.csv")
p <- ggplot(data = data, aes(x = variable, y = meas)) + geom_tile(aes(fill = value))

绘制对称范围的图形:

p + scale_fill_gradient2(low = "blue", mid = "white", high = "red", guide = "colorbar",
                         limits = c(-0.1, 0.1))

但是当更改上限时,下限的颜色映射也会发生变化(观察色条):

p + scale_fill_gradient2(low = "blue", mid = "white", high = "red", guide = "colorbar",
                         limits = c(-0.1, 0.3))

我可能误解了您的需求,但是请尝试将midpoint = -0.1传递给scale_fill_gradient2。这符合您的要求吗? - joran
我指的是 0.1,显然不是 -0.1,但现在我想根据Brian的答案,这也不是你要找的。 - joran
为什么这个函数的帮助文件如此简陋? - Herman Toothrot
1个回答

34

你需要使用scale_fill_gradientn函数。虽然它的参数不是很清晰(我自己花了一个小时左右才理解其中的一部分),但是这个函数可以实现你想要的效果。

library("scales")
p + scale_fill_gradientn(colours = c("blue","white","red"), 
                         values = rescale(c(-.1,0,.3)),
                         guide = "colorbar", limits=c(-.1,.3))

这将会得到以下结果:

在此输入图片描述


谢谢,我想现在我明白了。如果我理解错了,请纠正我,values是用来分配从colours向量中映射的颜色值的吗? 唯一我不明白的是,如果传递给values的向量比传递给colours的向量具有更多的元素,会发生什么? - Dahaniel
valuescolours应该具有相同的长度。它们是有效配对的,其中值对应于该点处的颜色,并且在该点和下一个点之间的所有内容都进行插值。实际上,我不知道如果它们的长度不同会发生什么;至少在概念上是一个错误,但我不知道是否会抛出实际错误。在您的示例中,-0.1映射到蓝色,0.0映射到白色,0.3映射到红色;在-0.1和0.0之间的值在蓝色和白色之间进行插值;在0.0和0.3之间的值在白色和红色之间进行插值。 - Brian Diggs
@BrianDiggs 我正在类似的方式使用您的解决方案,但是否有一种方法可以离散地显示前几个值的颜色条?例如:这里的花萼长度答案 - guy
@tbone 我不知道。这个问题值得单独提出来问。 - Brian Diggs
3
针对0.9版本之后来到这个问题的任何人,你需要执行library(scales)来包含重新缩放命令,就像这里所示:https://dev59.com/Q2LVa4cB1Zd3GeqPvE9k - elisa
太棒了!我一直在苦苦寻找解决这个问题的方法,这个答案非常好,谢谢 ;) - umbe1987

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