如何绘制类似维基百科的3D(或4D?)Dirichlet概率密度函数图?
绘制Dirichlet概率密度函数的可视化方案
我明白你想复刻维基百科上那种Dirichlet概率密度函数的可视化图,手里已经有10万行由rdirichlet生成的三元样本(每行元素和为1),还能用DirichletReg画出类似维基百科右下角的热图对吧?先把你那部分代码补全并整理好,再给你说说怎么实现3D版本的可视化~
一、完善你的Dirichlet热图代码
你给出的代码有点不完整,我帮你补全成可直接运行的版本,这样就能生成对应维基百科右下角的三角热图:
library(gtools) library(DirichletReg) # 生成10万行Dirichlet样本,alpha参数设置为c(10,1,10) dat <- rdirichlet(100000, alpha = c(10,1,10)) # 转换为DirichletReg要求的数据格式并绘制热图 plot(DR_data(dat), a2d = list(col = heat.colors(100)), # 用渐变色区分密度高低 main = "Dirichlet分布热图 (α=(10,1,10))")
这个热图是把三元样本投影到二维单纯形(三角平面)上,用颜色深浅表示区域的样本密度,和维基百科里的右下角图逻辑完全一致。
二、绘制3D版Dirichlet概率密度图
如果想要更直观的3D效果(把密度作为高度,在单纯形平面上呈现山峰状),可以用rgl包实现交互式3D可视化,步骤如下:
1. 安装并加载所需工具包
install.packages(c("gtools", "rgl", "ks")) # ks包用于核密度估计 library(gtools) library(rgl) library(ks)
2. 生成样本并做核密度估计
因为我们是通过样本估计真实密度,所以用核密度方法来计算每个位置的密度值:
# 生成目标Dirichlet样本 dat <- rdirichlet(100000, alpha = c(10,1,10)) # 对单纯形上的样本做核密度估计,指定空间类型为单纯形 dens <- kde(x = dat, H = Hscv(dat), binned = TRUE, domain = list(type = "simplex"))
3. 绘制交互式3D曲面图
先把单纯形坐标转换为笛卡尔坐标,再用rgl绘制3D曲面:
# 定义单纯形坐标转笛卡尔坐标的函数,适配rgl的3D绘图 simplex_to_cart <- function(p) { x <- p[,1] + p[,2]/2 y <- (sqrt(3)/2)*p[,2] cbind(x, y) } # 转换密度估计网格点的坐标 cart_coords <- simplex_to_cart(dens$eval.points) # 开启rgl窗口绘制3D图 open3d() surface3d(cart_coords[,1], cart_coords[,2], dens$estimate, col = heat.colors(100)[cut(dens$estimate, 100)], xlab = "X1", ylab = "X2", zlab = "Density", main = "3D Dirichlet密度图 (α=(10,1,10))") # 添加颜色图例辅助理解 legend3d("topright", legend = c("低密度", "高密度"), fill = heat.colors(2), cex = 0.8)
这个3D图会在三角平面基础上,用高度表示概率密度的大小,和维基百科里的3D示例图效果类似,而且支持交互旋转查看细节。
三、补充说明
- 对于三元Dirichlet分布,因为三个变量满足
X1+X2+X3=1,所以本质是二维单纯形上的分布,所谓的“3D图”是把密度作为第三个维度呈现曲面效果;如果是四元Dirichlet分布才涉及4D概念,你这里用2D单纯形+密度高度的3D可视化就足够啦。 - 如果需要静态3D图,也可以用
plot3D包的persp3D函数实现,代码逻辑和上面一致,只是绘图函数替换即可。
内容的提问来源于stack exchange,提问作者flee
相关产品推荐
相关产品推荐

