You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:58:25