2015-05-22 35 views
3

密度线之间着色领域我有这样的情节ggplot:根据相对位置

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

我不知道这是可以想象的,填补了红色和蓝色的密度线条之间的区域有两种颜色:一种颜色时,蓝色当蓝线在下面时,线在红线之上并且不同的颜色。

回答

0

您可以使用填充和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") 

我希望这有助于。干杯

3

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

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