如何用ggplot2叠加两个不同颜色的二元高斯分布等高线?
叠加两条二元高斯分布等高线的解决方案
没问题!我来帮你调整代码,实现两条二元高斯分布等高线的叠加,还能给每条等高线设置专属颜色。你之前尝试stat_density2d没成功,是因为这个函数是基于样本数据计算密度,而我们这里是直接生成理论二元高斯密度值,所以直接用geom_contour配合预先计算好的概率值就可以,核心是让ggplot能区分两个分布的数据。
修改后的可复现代码
# 加载依赖包 library(ggplot2) library(mvtnorm) set.seed(13) # 定义第一个二元高斯分布参数 m1 <- c(.5, -.5) sigma1 <- matrix(c(1,.5,.5,1), nrow=2) # 定义第二个二元高斯分布参数 m2 <- c(0, 0) sigma2 <- matrix(c(140,67,67,42), nrow=2) # 生成网格数据 data.grid <- expand.grid(s.1 = seq(-25, 25, length.out=200), s.2 = seq(-25, 25, length.out=200)) # 计算两个分布的概率值,同时添加分组标识 q.samp1 <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = m1, sigma = sigma1), group = "分布1") q.samp2 <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = m2, sigma = sigma2), group = "分布2") # 合并成长格式数据框,方便ggplot分组绘制 q.samp_combined <- rbind(q.samp1, q.samp2) # 绘制叠加等高线 ggplot(q.samp_combined, aes(x = s.1, y = s.2, z = prob, color = group)) + geom_contour() + # 自定义颜色(可选,你可以换成自己喜欢的颜色) scale_color_manual(values = c("分布1" = "#2ca02c", "分布2" = "#d62728")) + coord_fixed(xlim = c(-25, 25), ylim = c(-25, 25), ratio = 1) + labs(title = "两条二元高斯分布等高线叠加", x = "s.1", y = "s.2", color = "分布类型")
更简洁的图层叠加方式
如果你不想合并数据框,也可以直接添加两个geom_contour图层,每个图层指定独立的数据源和颜色:
ggplot() + # 第一条等高线 geom_contour(data = q.samp1, aes(x = s.1, y = s.2, z = prob), color = "#2ca02c", size = 0.8) + # 第二条等高线 geom_contour(data = q.samp2, aes(x = s.1, y = s.2, z = prob), color = "#d62728", size = 0.8) + coord_fixed(xlim = c(-25, 25), ylim = c(-25, 25), ratio = 1) + labs(title = "两条二元高斯分布等高线叠加", x = "s.1", y = "s.2")
小提示
你定义的第二个分布协方差矩阵sigma2数值很大,导致它的分布极其分散,在-25到25的坐标范围内可能只能看到最外围的1-2条等高线。如果想看到更多细节,可以适当缩小x/y轴范围,或者调整协方差矩阵的数值。
内容的提问来源于stack exchange,提问作者user24318
相关产品推荐
相关产品推荐

