如何在R语言3D高斯分布绘图的内部区域添加点
解决3D正态分布线框图内部填充红色点的问题
问题出在你直接使用了3D正态分布的密度值作为点的z坐标,导致点刚好落在曲面高度上。要让点处于绘图内部,需要让每个点的z值小于对应(x,y)位置的曲面高度,也就是在0到该点的密度值之间随机取值。
以下是完整的实现代码:
# 加载所需包 library(plotly) library(mvtnorm) # 定义3D正态分布参数:均值向量与协方差矩阵 mean_vec <- c(0, 0) cov_mat <- matrix(c(1, 0, 0, 1), nrow = 2) # 独立标准正态分布 # 生成x、y范围(-1到1)内的随机点 n_points <- 5000 # 可调整点的数量 x_rand <- runif(n_points, -1, 1) y_rand <- runif(n_points, -1, 1) # 计算每个(x,y)对应的曲面高度(密度值) z_surface <- dmvnorm(cbind(x_rand, y_rand), mean = mean_vec, sigma = cov_mat) # 生成内部点的z值:0到对应曲面高度之间的随机数 z_rand <- runif(n_points, 0, z_surface) # 生成线框图的网格数据 x_grid <- seq(-1, 1, length.out = 50) y_grid <- seq(-1, 1, length.out = 50) z_grid <- outer(x_grid, y_grid, function(x, y) dmvnorm(cbind(x, y), mean = mean_vec, sigma = cov_mat)) # 组合线框图与内部点 fig <- plot_ly() %>% # 添加线框图(设置透明度方便观察内部点) add_surface( x = x_grid, y = y_grid, z = z_grid, opacity = 0.5, showscale = FALSE ) %>% # 添加内部红色点 add_markers( x = x_rand, y = y_rand, z = z_rand, color = I("red"), size = I(2), opacity = 0.6 ) %>% layout( scene = list( xaxis = list(title = "X"), yaxis = list(title = "Y"), zaxis = list(title = "Z") ) ) # 显示图形 fig
关键修改说明:
- 不再直接用
dmvnorm的结果作为点的z值,而是通过runif(n_points, 0, z_surface)生成每个点的z值,确保z落在0到对应曲面高度之间,让点处于曲面下方的内部空间。 - 给线框图设置
opacity = 0.5,可以更清晰地看到内部的红色点。 - 调整
n_points参数可控制内部点的密集程度,数值越大点越多。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

