gpt4 book ai didi

r - ggplot : colouring areas between density lines according to relative position

转载 作者:行者123 更新时间:2023-12-04 12:32:04 25 4
gpt4 key购买 nike

我有这个情节

set.seed(28100)
df <- data.frame(value = sample(1:10000,1000,replace=TRUE),
gender = sample(c("male","female"),1000,replace=TRUE))

ggplot(df, aes(value)) +
geom_density() +
geom_density(data=subset(df, gender=='male'), aes(value), colour="blue") +
geom_density(data=subset(df, gender=='female'), aes(value), colour="red")

我想知道是否可以用两种颜色填充红色和蓝色密度线之间的区域:当蓝线在红线上方时使用一种颜色,在蓝线下方时使用不同的颜色。

最佳答案

除非您自己明确计算区域,否则没有简单的方法可以在不同的重叠区域中着色。这是一个可以帮助计算密度交换位置的区域的函数

densitysplit <- function(val, grp, N=200, x=seq(min(val), max(val), length.out=N)) {
grp <- factor(grp)
den <- Map(function(z) {
dx<-density(val[grp==z])
approxfun(dx$x, dx$y)(x)
}, levels(grp))
maxcat <- apply(do.call("cbind",den), 1, which.max)
data.frame(x=x, ymin=do.call("pmin", den), ymax=do.call("pmax", den),
top = levels(grp)[maxcat],
group = cumsum(c(1,diff(maxcat)!=0))
)
}

对于你的数据,你会做这样的事情
head(densitysplit(df$value, df$gender))
# x ymin ymax top group
# 1 8.00000 4.214081e-05 5.198326e-05 male 1
# 2 58.17085 4.485596e-05 5.433638e-05 male 1
# 3 108.34171 4.760983e-05 5.665547e-05 male 1
# 4 158.51256 5.039037e-05 5.893143e-05 male 1
# 5 208.68342 5.318724e-05 6.115595e-05 male 1
# 6 258.85427 5.598707e-05 6.332672e-05 male 1

这为您提供了您需要使用的数据 geom_ribbon绘制数据。你可以做
ggplot(df, aes(value)) + 
geom_ribbon(data=densitysplit(df$value, df$gender), aes(x, ymin=ymin, ymax=ymax, fill=top, group=group)) +
geom_density() +
geom_density(data=subset(df, gender=='male'), aes(value), colour="blue") +
geom_density(data=subset(df, gender=='female'), aes(value), colour="red")

enter image description here

关于r - ggplot : colouring areas between density lines according to relative position,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30400447/

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