使用离散的 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 值之间绘制体积轨迹,坐标由四个一维数组给出,这些数组包含均匀或非均匀的每个顶点的
value
、x
、y
和z
统一的 3-D 网格。也可以使用此轨迹绘制水平或垂直切片、大写字母以及 iso-min 和 iso-max 值之间的空间框架。
plotly 的 python 版本提供了一个示例:https://plotly.com/python/3d-volume-plots/ 但我不知道我在哪里错过了到 R 的转换。我已经包含了体积图的额外值维度,但它似乎没有做任何事。
【问题讨论】:
【参考方案1】:与 plotly 的文档中指出您可以使用非均匀网格和体积不同,实际上不可能使用 isomin
和 isomax
绘制 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 体积图的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 matplotlib 在 python 中绘制 3D 密度图