【发布时间】:2013-09-26 00:43:59
【问题描述】:
例如,我想将颜色映射到z,将 0 映射到“白色”。
> a <- data.frame(x=1:10, y=1, z=c(rnorm(8),-12,12))
> a
x y z
1 1 1 -0.4603911
2 2 1 -0.4868471
3 3 1 0.2180346
4 4 1 -0.8807652
5 5 1 1.7379462
6 6 1 -0.1334904
7 7 1 -0.3675578
8 8 1 0.9225425
9 9 1 -12.0000000
10 10 1 12.0000000
ggplot(a,aes(x=x,y=y,fill=z)) + geom_bar(stat="identity") +
scale_fill_gradient2(high="green", mid="white", low="red")
正如您所见,颜色并不是真正有用的指标,而是传达值如何分布的一般概念,现在颜色仅说明哪些值是极端值,未经训练的眼睛无法区分大多数值。
有一个方法Non-linear color distribution over the range of values in a geom_raster,不过好像有点复杂,我只能隐约理解它是怎么工作的。
然后我想也许order 是一个很好的重新调整方式,因此:
ggplot(a,aes(x=x,y=y,fill=ecdf(z)(z))) + geom_bar(stat="identity") +
scale_fill_gradient2(high="green", mid="white", low="red", midpoint=ecdf(a$z)(0))
它在某种程度上起作用(这里我使用ecdf 而不是order 来查找重新缩放的值0。但是,缺点是,我想将图例的标签保留为未缩放的值,而不是重新缩放的那些。所以像labels=function(x) quantile(a$z, x) 这样的东西,我无法让它工作。另外,我发现重复使用ecdf 和quantile 向前和向后重新缩放是愚蠢的。
在这些情况下是否有更好或更简单的方法,例如足够强大(不需要优化或非常准确),足以为各种映射值的分布填充合理的颜色。
【问题讨论】: