鉴于对原始问题的评论,我想强调以下两点应该适用于这个问题的答案:
1)最终的图应该是真正的矢量图,类似于乳胶中的pgfplots / tikz包。
2)最终的绘图应该是包含多个元素的正确3D绘图,因此绘图包可能需要使用z-buffering进行投影和正确渲染。
我想使用python在单个图像中可视化/绘制3D表面和几何形状。我一般对3D可视化感兴趣,但是现在我正在尝试执行以下操作:我想在3D中绘制马鞍形状(例如,作为适当功能的表面图)并且另外显示3D球体这是在马鞍的某一点切线。这可以单独使用matplotlib完成,还是需要使用像VTK这样更复杂的3D软件包?即使它可以在matplotlib中完成,你会推荐matplotlib用于这样的应用程序,还是应该使用专门为此目的而构建的程序?
为了让您了解我想要仅使用python实现的目标,请参阅here。这是使用乳胶中的pgfplots完成的,但正如我在该问题中提到的那样,该包装存在局限性。它也不是python。
我对照片般逼真的外观或花哨渲染不感兴趣。这是一个物理/数学应用程序,我希望图像具有"外观"使用mplot3D或pgfplots在乳胶中获得的图表(以便表面在外观上呈现为this)。我已经看过python的3D渲染包,虽然我无法真正量化它的原因(我认为它可能是照明和光栅图形),但是它们中的许多输出看起来更像是视频游戏中的东西。科学出版物(虽然这可能是针对那些渲染器的。)
我知道这是一个相当广泛的问题,如果有人对此提出异议,我很乐意重新解释这个问题或使其更具体。但是,我相信有一个问题的答案很有意思,即使用matplotlib是否可以并且应该使用形状的一般三维可视化。
答案 0 :(得分:1)
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()
请注意,您可以使用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()