R在散点图上叠加二元正态密度(椭圆)

时间:2015-02-04 08:57:13

标签: r plot covariance mean normal-distribution

网站上也有类似的问题,但我找不到这个看似非常简单的问题的答案。我在Old Faithful Dataset上混合了两位高斯:

if(!require("mixtools")) { install.packages("mixtools");  require("mixtools") }
data_f <- faithful
plot(data_f$waiting, data_f$eruptions)
data_f.k2 = mvnormalmixEM(as.matrix(data_f), k=2, maxit=100, epsilon=0.01) 
data_f.k2$mu # estimated mean coordinates for the 2 multivariate Gaussians
data_f.k2$sigma # estimated covariance matrix 

我只想对由均值向量data_f.k2$mu和协方差矩阵data_f.k2$sigma描述的模型的两个高斯分量强加两个椭圆。得到类似的东西:

enter image description here

对于那些感兴趣的人,here是创建上图的MatLab解决方案。

3 个答案:

答案 0 :(得分:2)

如果您对颜色感兴趣,可以使用后部来获得适当的颜色。我是用ggplot2完成的,但首先我使用@ Julian的代码显示彩色解决方案。

# group data for coloring
data_f$group <- factor(apply(data_f.k2$posterior, 1, which.max))
# plotting
plot(data_f$eruptions, data_f$waiting, col = data_f$group)
for (i in 1: length(data_f.k2$mu))  ellipse(data_f.k2$mu[[i]],data_f.k2$sigma[[i]], col=i)

对于我使用ggplot2的版本。

# needs ggplot2 package
require("ggplot2")
# ellipsis data 
ell <- cbind(data.frame(group=factor(rep(1:length(data_f.k2$mu), each=250))), 
             do.call(rbind, mapply(ellipse, data_f.k2$mu, data_f.k2$sigma, 
                                   npoints=250, SIMPLIFY=FALSE)))

# plotting command
p <- ggplot(data_f, aes(color=group)) + 
  geom_point(aes(waiting, eruptions)) +
  geom_path(data=ell, aes(x=`2`, y=`1`)) +
  theme_bw(base_size=16)
print(p)

答案 1 :(得分:1)

您可以使用包ellipse中的mixtools - 功能。最初的问题是这个函数从你的图中交换x和y。我会尝试解决这个问题并更新回复。 (我将这些颜色留给别人......)

plot( data_f$eruptions,data_f$waiting)
for (i in 1: length(data_f.k2$mu))  ellipse(data_f.k2$mu[[i]],data_f.k2$sigma[[i]])

答案 2 :(得分:0)

使用mixtools内部绘图功能:

plot.mixEM(data_f.k2, whichplots=2)

相关问题