python - 矢量图形中表面和形状的 3D 可视化

标签 python matplotlib visualization vector-graphics

鉴于对原始问题的评论,我想强调以下两点应该适用于对这个问题的回答:

1) 最后的图应该是一个真正的矢量图形,类似于 latex 中的 pgfplots/tikz 包产生的结果。

2) 最终绘图应该是包含多个元素的正确 3D 绘图,因此绘图包可能需要使用 z-buffering 才能正确投影和渲染。

我想使用 python 在单个图像中可视化/绘制 3D 表面和几何形状。一般来说,我对 3D 可视化很感兴趣,但现在我正在尝试执行以下操作:我想在 3D 中绘制一个鞍形(例如,作为适当函数的曲面图)并另外显示一个 3D 球体与鞍座的某一点相切。这可以单独使用 matplotlib 来完成,还是我需要使用更复杂的 3D 包,如 VTK?即使可以在 matplotlib 中完成,您会为此类应用程序推荐 matplotlib 还是我应该使用专门为此目的构建的程序?

为了让您了解我想仅使用 Python 实现什么,请参阅 here .这是在 latex 中使用 pgfplots 完成的,但正如我在该问题中提到的那样,该软件包存在局限性。它也不是 python。

我对逼真的外观或花哨的渲染不感兴趣。这是一个物理/数学应用程序,我希望图像具有您在 latex 中使用 mplot3D 或 pgfplots 获得的绘图的“外观”(这样表面在外观上呈现为 this)。我看过 python 的 3D 渲染包,虽然我无法真正量化其中的原因(我认为这可能是照明和光栅图形),但其中许多的输出看起来更像是视频游戏中的东西而不是一份科学出版物(尽管这可能是为那些渲染器准备的)。

我知道这是一个相当宽泛的问题,如果对此有异议,我很乐意重新表述问题或使其更具体。但是,我相信回答是否可以并且应该使用 matplotlib 来完成形状的一般 3D 可视化这个问题是很有趣的。

最佳答案

Matplotlib 和 mplot3d 可能无法满足您的需求,因为 matplotlib 不执行 3d 渲染(参见 Is there something like a depth buffer in matplotlib?)。但是,VTK 对于您想要执行的操作来说可能太重了。

这是一个示例,说明您可以使用 visvis 包做什么:( https://github.com/almarklein/visvis )

import visvis as vv
import numpy as np

# Saddle surface.
x_saddle = np.arange(-5, 5, 0.25)
y_saddle = np.arange(-5, 5, 0.25)
x_saddle, y_saddle = np.meshgrid(x_saddle, y_saddle)
z_saddle = x_saddle**2/10. - y_saddle**2/10.

# Sphere
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

radius = 2.0
x_sphere = radius * np.outer(np.cos(u), np.sin(v))
y_sphere = radius * np.outer(np.sin(u), np.sin(v))
z_sphere = 2.0 + radius * np.outer(np.ones(np.size(u)), np.cos(v))

vv.figure()

# Plot the surfaces
vv.surf(X, Y, Z)
vv.surf(x, y, z)

app = vv.use()
app.Run()

Saddle shape and sphere rendered with visvis

请注意,您可以使用 Mayavi 做一些非常相似的事情,但在我看来,使用 visvis 轴看起来更好:

from mayavi import mlab
import numpy as np

# Saddle surface.
x_saddle = np.arange(-5, 5, 0.25)
y_saddle = np.arange(-5, 5, 0.25)
x_saddle, y_saddle = np.meshgrid(x_saddle, y_saddle)
z_saddle = x_saddle**2/10. - y_saddle**2/10.

# Sphere
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

radius = 2
x_sphere = radius * np.outer(np.cos(u), np.sin(v))
y_sphere = radius * np.outer(np.sin(u), np.sin(v))
z_sphere = 2.0 + radius * np.outer(np.ones(np.size(u)), np.cos(v))


# Plot the surface.
mlab.mesh(x_saddle, y_saddle, z_saddle)
mlab.mesh(x_radius, y_radius, z_radius)

mlab.axes()
mlab.show()

Saddle shape and sphere rendered with Mayavi

关于python - 矢量图形中表面和形状的 3D 可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49836827/

相关文章:

python - 用python计算纬度和经度之间的距离?

javascript - 灵活的 Javascript 图形可视化框架

algorithm - 如何做算法可视化?

python - 我可以在不附加到 Table._prefixes 的情况下在 SQLAlchemy 中创建临时表吗?

python - 如何在 python-docx 中获取单元格背景颜色?

python - 尝试通过 python 中的套接字传递(大)图像时出错

python - 使用 botocore stub 时出现 UnrecognizedClientException

python - 从 C++ 嵌入式解释器捕获 python 窗口输出

python - Matplotlib:Draggable 不适用于使用 twinx() 生成的多个图例

python - Seaborn:避免绘制缺失值(线图)