gpt4 book ai didi

r - 使用scale_fill_gradient时处理极值/分布的其他方法?

转载 作者:行者123 更新时间:2023-12-01 18:10:55 27 4
gpt4 key购买 nike

例如,我想将颜色映射到 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但似乎有点复杂,我只能模糊地理解它是如何工作的。

enter image description here

然后我想也许 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) 的东西,我无法使其工作。另外,我发现重复使用 ecdfquantile 向前和向后重新缩放是愚蠢的。

在这些情况下有没有更好或更简单的方法,例如足够鲁棒(不需要是最优的或非常准确)足以为映射值的各种分布填充合理的颜色。

enter image description here

最佳答案

据我所知,没有一种简单的方法,但您可以使用 scale_fill_gradientn 完全控制映射。关键是将颜色映射到 0-1 范围内的值,其中 0 是最小值,1 是最大值。这是一个选项:

library(ggplot2)
a <- data.frame(x=1:10, y=1, z=c(rnorm(8),-12,12))
get_col <- colorRamp(c("red", "white", "green")) # make fun to interpolate colors
quantiles <- (0:6) / 6 # how many quantiles we want to map
quantile.vals <- quantile(a$z, quantiles, names=F)# the values for each quantile
colours <- rgb(get_col(quantiles), max=255) # 7 evenly interpolated colors
val.remap <- (quantile.vals - min(a$z)) /
diff(range(a$z)) # The values corresponding to the quantiles

ggplot(a, aes(x=x,y=y,fill=z)) +
geom_bar(stat="identity") +
scale_fill_gradientn(
colours=colours,
values=val.remap,
breaks=quantile.vals,# Necessary to get legend values spread appropriately
guide="legend") # Necessary to get legend values spread appropriately

在这里,我们选择根据值的分布将均匀插值的颜色分配给值。因此,如果一个值范围对应于分布的很大一部分,即使它实际上跨越了最小-最大范围的相对较小的部分,它也会分配更多的颜色。

如果您想将特定颜色分配为零,可以通过编辑与颜色中断相对应的向量来实现> 论据。如果您有相同数量的高于和低于零的值,则这很简单;如果没有,则很烦人。

<小时/>

版本 w/0 设置为白色:

library(ggplot2)
a <- data.frame(x=1:10, y=1, z=c(rnorm(8), -12, 12))
splits <- 7 # should be odd number
mid.point <- 0
pos.vals <- a$z[a$z > mid.point]
neg.vals <- a$z[a$z < mid.point]
pos.quants <- quantile(c(mid.point, pos.vals), 0:((splits - 1) / 2) / ((splits - 1) / 2), names=F)
neg.quants <- quantile(c(mid.point, neg.vals), 0:((splits - 1) / 2) / ((splits - 1) / 2), names=F)
quants <- c(neg.quants, pos.quants[-1]) # drop of the mid-point from pos.quants since otherwise double counted

get_col <- colorRamp(c("red", "white", "green")) # make fun to interpolate colors
colours <- rgb(get_col(0:(splits - 1)/(splits - 1)), max=255) # 7 evenly interpolated colors
val.remap <- (quants - min(quants)) /
diff(range(quants)) # The values corresponding to the quantiles

ggplot(a, aes(x=x,y=y,fill=z)) +
geom_bar(stat="identity") +
scale_fill_gradientn(
colours=colours,
values=val.remap,
breaks=quants,
guide="legend")

color mapping result

关于r - 使用scale_fill_gradient时处理极值/分布的其他方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19017492/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com