使用 ggplot2 在 R 中绘制高斯混合图
Plot Gaussian Mixture in R using ggplot2
我正在用高斯混合近似分布,想知道是否有一种简单的方法可以自动将整个(一维)数据集的估计内核密度绘制为漂亮的组件密度之和像这样使用 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 个密度或根本没有密度时,它也不起作用。所以我无法复制上面的情节。
此外,我无法在不手动设置子集的情况下自动生成此图。我尝试在 geom_density.
中使用 position = "stacked" 作为参数
我通常每个数据集有大约 5-6 个组件,因此可以手动进行子集化。但是,我希望在 ggplot 的图例中显示每个组件密度的不同颜色或线型,因此手动执行所有子集会增加很多工作量。
有什么想法吗?
谢谢!
这是一个可能的解决方案,通过在一层中使用 position = "identity"
指定 aes
调用中的每个密度,在第二层中使用不带图例的堆叠密度。
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))
我正在用高斯混合近似分布,想知道是否有一种简单的方法可以自动将整个(一维)数据集的估计内核密度绘制为漂亮的组件密度之和像这样使用 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 个密度或根本没有密度时,它也不起作用。所以我无法复制上面的情节。
此外,我无法在不手动设置子集的情况下自动生成此图。我尝试在 geom_density.
中使用 position = "stacked" 作为参数我通常每个数据集有大约 5-6 个组件,因此可以手动进行子集化。但是,我希望在 ggplot 的图例中显示每个组件密度的不同颜色或线型,因此手动执行所有子集会增加很多工作量。
有什么想法吗? 谢谢!
这是一个可能的解决方案,通过在一层中使用 position = "identity"
指定 aes
调用中的每个密度,在第二层中使用不带图例的堆叠密度。
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))