R语言中如何可视化多元正态分布的积分区域
R中3D正态分布积分区域的可视化方法
基础数据准备
先完成3D正态分布的网格数据生成,这是后续可视化的基础:
library(plotly) library(mvtnorm) # 生成XY网格(范围覆盖目标区域及周边) x <- seq(-3, 3, length.out = 50) y <- seq(-3, 3, length.out = 50) grid <- expand.grid(X = x, Y = y) # 计算二维正态分布密度(均值(0,0),单位协方差矩阵) grid$Z <- dmvnorm(grid, mean = c(0,0), sigma = diag(2))
方法一:曲面着色高亮目标区域
直接将X∈[-1,1]、Y∈[-1,1]对应的曲面部分用不同颜色标记,比修改线框图颜色更直观:
# 标记目标区域 grid$region <- ifelse(grid$X >= -1 & grid$X <= 1 & grid$Y >= -1 & grid$Y <= 1, "积分区域", "其他区域") # 绘制着色曲面 plot_ly(grid, x = ~X, y = ~Y, z = ~Z, color = ~region, colors = c("#1f77b4", "#ff7f0e"), type = "surface") %>% layout(scene = list(xaxis = list(title = "X"), yaxis = list(title = "Y"), zaxis = list(title = "密度值Z")))
如果坚持使用线框图,只需将type = "surface"改为type = "wireframe",但线框图的颜色区分效果弱于曲面。
方法二:填充层标记积分体积
若要突出“积分是曲面到XY平面的体积”这一概念,可添加半透明填充层覆盖目标区域的体积范围:
# 提取目标区域数据 target_grid <- subset(grid, X >= -1 & X <= 1 & Y >= -1 & Y <= 1) # 生成底部填充数据(Z=0,即XY平面) bottom_grid <- target_grid bottom_grid$Z <- 0 # 组合数据用于绘制填充体积 fill_mesh <- rbind(target_grid, bottom_grid) # 先画基础密度曲面,再叠加填充层 plot_ly(grid, x = ~X, y = ~Y, z = ~Z, type = "surface", opacity = 0.7, colors = "viridis") %>% add_mesh(data = fill_mesh, x = ~X, y = ~Y, z = ~Z, color = "rgba(255, 127, 14, 0.5)", alphahull = 0) %>% layout(scene = list(xaxis = list(title = "X"), yaxis = list(title = "Y"), zaxis = list(title = "密度值Z")))
方法三:结合积分数值标注
可视化的同时计算目标区域的积分值,标注在图中让结果更具参考性:
# 计算目标区域的积分值(二维正态分布的概率) integral_value <- pmvnorm(lower = c(-1, -1), upper = c(1, 1), mean = c(0,0), sigma = diag(2))[[1]] # 在图中添加数值标注(基于方法一的曲面图) plot_ly(grid, x = ~X, y = ~Y, z = ~Z, color = ~region, colors = c("#1f77b4", "#ff7f0e"), type = "surface") %>% layout(scene = list(xaxis = list(title = "X"), yaxis = list(title = "Y"), zaxis = list(title = "密度值Z"))) %>% add_annotations(x = 0, y = 0, z = max(grid$Z)/2, text = paste0("积分值: ", round(integral_value, 4)), showarrow = FALSE, font = list(size = 12, color = "black"))
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

