使用离散的 3D 点在 R 中绘制 3D 体积图

Posted

技术标签:

【中文标题】使用离散的 3D 点在 R 中绘制 3D 体积图【英文标题】:Plotting a 3D volume plot in R using discrete 3D points 【发布时间】:2021-05-14 10:21:35 【问题描述】:

我正在尝试在 R 中创建一个体积图,以显示 3D 空间中点的平滑密度。我目前正在使用 plotly 与 scatter3D 进行绘图。

  df = data.frame(a = sample(seq(.5,.8,.001),100), 
              b = sample(seq(0,.5,.001),100), 
              c = sample(seq(0,.3,.001),100), 
              value = sample(seq(0,1,.01),100))


plot_ly(df, x = ~a, y = ~b, z = ~c, type = 'scatter3d')

将类型设置为“mesh3d”可以将这些点连接为 3d 空间中的表面。

  plot_ly(df, x = ~a, y = ~b, z = ~c, type = 'mesh3d')

但是,尝试将类型设置为“体积”每次都会给我一个空白图。

  plot_ly(df, x = ~a, y = ~b, z = ~c, value = ~value, type = 'volume', 
          isomin = 0, isomax = 1, opacity = 1)

文档在这里:https://plotly.com/r/reference/volume/ 并指定:

在 iso-min 和 iso-max 值之间绘制体积轨迹,坐标由四个一维数组给出,这些数组包含均匀或非均匀的每个顶点的valuexyz统一的 3-D 网格。也可以使用此轨迹绘制水平或垂直切片、大写字母以及 iso-min 和 iso-max 值之间的空间框架。

plotly 的 python 版本提供了一个示例:https://plotly.com/python/3d-volume-plots/ 但我不知道我在哪里错过了到 R 的转换。我已经包含了体积图的额外值维度,但它似乎没有做任何事。

【问题讨论】:

【参考方案1】:

与 plotly 的文档中指出您可以使用非均匀网格和体积不同,实际上不可能使用 isominisomax 绘制 3d 体积。有一个不均匀的坐标会使整个图无效。我为同样的问题苦苦挣扎了很久,想知道为什么我的情节总是空白。

为了演示,首先创建一个具有统一网格的图。例如,使用您链接的资源中的 Python 示例:https://plotly.com/python/3d-volume-plots/。 (不管是 Python API,渲染绘图与语言无关)。

import plotly.graph_objects as go
import numpy as np
X, Y, Z = np.mgrid[-8:8:40j, -8:8:40j, -8:8:40j]
values = np.sin(X*Y*Z) / (X*Y*Z)

fig = go.Figure(data=go.Volume(
    x=X.flatten(),
    y=Y.flatten(),
    z=Z.flatten(),
    value=values.flatten(),
    isomin=0.1,
    isomax=0.8,
    opacity=0.1, # needs to be small to see through all surfaces
    surface_count=17, # needs to be a large number for good volume rendering
    ))
fig.show()

这应该显示一个情节。接下来,改变一个点的坐标:

X[0, 0, 0] += 1

还有 tada:它不再起作用并显示一个空的情节。

【讨论】:

以上是关于使用离散的 3D 点在 R 中绘制 3D 体积图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 的 3D 图中从分类算法中绘制分区平面

在 R 中绘制 3D GIF

R语言使用plotly绘制3D散点图实战

如何使用 matplotlib 在 python 中绘制 3D 密度图

R语言使用persp函数绘制三维图像实战(3D):自定义3D图图像旋转添加轴标签

使用 R 进行 2D 投影的 3D 表面