使用ggplot2

时间:2017-11-12 12:13:05

标签: r ggplot2 gaussian mixture

我用高斯混合物近似分布,并且想知道是否有一种简单的方法可以自动绘制整个(单维)数据集的估计核密度作为组分密度的总和,以一种很好的方式像这样使用ggplot2:

Full data density plotted with single component densities

鉴于以下示例数据,我在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)

ggplot2 Plot

请注意,这与秤无关。当您扩展所有3个密度或根本没有密度时,它也不起作用。所以我无法复制上面的情节。

此外,我无法自动生成此绘图而无需手动配置。我尝试使用position =&#34; stacked&#34;作为geom_density中的参数。

每个数据集通常有大约5-6个组件,因此可以手动进行子集化。但是,我想在ggplot的图例中显示每个组件密度的不同颜色或线型,因此手动执行所有子集会大大增加工作量。

有什么想法吗? 谢谢!

1 个答案:

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

enter image description here

请注意,当使用两组以上时:

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

enter image description here

一个相对简单的解决方法是添加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))

enter image description here