鉴于对原问题的评论,我想强调以下两点,这两点应适用于回答这个问题:
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或this得到的绘图的“外观”(以便表面渲染在外观上类似于are )。我看过python的3D渲染包,虽然我不能真正量化其中的原因(我认为可能是光照和光栅图形),但其中许多包的输出看起来更像是视频游戏而不是科学出版物(尽管这可能是为这些渲染器设计的)。
我知道这是一个相当广泛的问题,如果有人反对这个问题,我很乐意改变措辞,或说得更具体一些。然而,我相信,对于形状的一般3D可视化是否可以并且应该使用matplotlib的问题,有一个答案是很有趣的。
发布于 2018-04-16 00:13:50
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()

https://stackoverflow.com/questions/49836827
复制相似问题