Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R ggplot:根据相对位置为密度线之间的区域着色_R_Ggplot2 - Fatal编程技术网

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")