我用高斯混合物近似分布,并且想知道是否有一种简单的方法可以自动绘制整个(单维)数据集的估计核密度作为组分密度的总和,以一种很好的方式像这样使用ggplot2:
鉴于以下示例数据,我在ggplot2中的方法是手动将子集密度绘制为缩放的整体密度,如下所示:
#example data
a<-rnorm(1000,0,1) #component 1
b<-rnorm(1000,5,2) #component 2
d<-c(a,b) #overall data
df<-data.frame(d,id=rep(c(1,2),each=1000)) #add group id
##ggplot2
require(ggplot2)
ggplot(df) +
geom_density(aes(x=d,y=..scaled..)) +
geom_density(data=subset(df,id==1), aes(x=d), lty=2) +
geom_density(data=subset(df,id==2), aes(x=d), lty=4)
请注意,这与秤无关。当您扩展所有3个密度或根本没有密度时,它也不起作用。所以我无法复制上面的情节。
此外,我无法自动生成此绘图而无需手动配置。我尝试使用position =&#34; stacked&#34;作为geom_density中的参数。
每个数据集通常有大约5-6个组件,因此可以手动进行子集化。但是,我想在ggplot的图例中显示每个组件密度的不同颜色或线型,因此手动执行所有子集会大大增加工作量。
有什么想法吗? 谢谢!
答案 0 :(得分:2)
这是一个可能的解决方案,通过在一个图层和第二个图层中使用aes
调用position = "identity"
调用中的每个密度,使用没有图例的堆叠密度。
ggplot(df) +
stat_density(aes(x = d, linetype = as.factor(id)), position = "stack", geom = "line", show.legend = F, color = "red") +
stat_density(aes(x = d, linetype = as.factor(id)), position = "identity", geom = "line")
请注意,当使用两组以上时:
a <- rnorm(1000, 0, 1)
b <- rnorm(1000, 5, 2)
c <- rnorm(1000, 3, 2)
d <- rnorm(1000, -2, 1)
d <- c(a, b, c, d)
df <- data.frame(d, id = as.factor(rep(c(1, 2, 3, 4), each = 1000)))
显示每个堆栈的曲线(这是两个组示例的问题,但第一层中的linetype
伪装成它 - 使用group
来检查):
gplot(df) +
stat_density(aes(x = d, group = id), position = "stack", geom = "line", show.legend = F, color = "red") +
stat_density(aes(x = d, linetype = id), position = "identity", geom = "line")
一个相对简单的解决方法是添加alpha映射并为不需要的曲线手动将其设置为0:
ggplot(df) +
stat_density(aes(x=d, alpha = id), position = "stack", geom = "line", show.legend = F, color = "red") +
stat_density(aes(x=d, linetype = id), position = "identity", geom = "line")+
scale_alpha_manual(values = c(1,0,0,0))