R ggplot:根据相对位置为密度线之间的区域着色
我有这个阴谋R ggplot:根据相对位置为密度线之间的区域着色,r,ggplot2,R,Ggplot2,我有这个阴谋 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')
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")
set.seed(28100)
df您可以使用fill和alpha生成(可能)所需的效果
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, colour=gender, fill=gender, alpha=0.5)) +
geom_density() +theme(legend.position="none")
set.seed(28100)
df除非您自己明确计算区域,否则没有简单的方法在不同的重叠区域中着色。这里有一个函数,可以帮助计算密度交换位置的区域
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))
)
}
这为您提供了使用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")
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")