Matplotlib 绘制三维图形全指南:从基础线框到莫比乌斯带

Alice
Alice
发布时间:2026-10-15 | 4人浏览过
原创

本文详细介绍如何使用 Matplotlib 库在 Python 中绘制多种三维图形。内容涵盖基础的 3D 线图和散点图,以及等高线图、线框图和曲面图的绘制方法。此外,还深入讲解了针对非均匀采样数据的曲面三角剖分技术,并通过莫比乌斯带的实例展示复杂曲面的构建过程。

利用 Matplotlib 库绘制三维图形

最基础的三维可视化形式包括基于 (x, y, z) 三维坐标点的线图与散点图。在 Matplotlib 中,可以通过调用 ax.plot3D 和 ax.scatter3D 函数来生成这些图形。默认情况下,散点图会自动调整透明度,从而在二维平面上呈现出具有立体感的视觉效果。

三维线图和散点图的实现


#绘制三角螺旋线
from mpl_toolkits import mplot3d
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

ax = plt.axes(projection='3d')

#三维线的数据
zline = np.linspace(0, 15, 1000)
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'gray')

# 三维散点的数据
zdata = 15 * np.random.random(100)
xdata = np.sin(zdata) + 0.1 * np.random.randn(100)
ydata = np.cos(zdata) + 0.1 * np.random.randn(100)
ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens')

三维等高线图的绘制


def f(x, y):
 return np.sin(np.sqrt(x ** 2 + y ** 2))
x = np.linspace(-6,6,30)
y = np.linspace(-6,6,30)
X, Y = np.meshgrid(x, y)
Z = f(X,Y)

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
#调整观察角度和方位角。这里将俯仰角设为60度,把方位角调整为35度
ax.view_init(60, 35)

线框图与曲面图的对比

曲面图与线框图在结构上相似,区别在于线框图的每个面由多边形构成,而曲面图则通过增加配色方案来填充这些多边形。这种方法有助于更直观地感受可视化图形表面的拓扑结构。


#线框图
fig =plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='c')
ax.set_title('wireframe')


#曲面图
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis', edgecolor='none')
ax.set_title('surface')


#使用极坐标可以获得切片的效果
r = np.linspace(0, 6, 20)
theta = np.linspace(-0.9 * np.pi, 0.8 * np.pi, 40)
r, theta = np.meshgrid(r, theta)
X = r * np.sin(theta)
Y = r * np.cos(theta)
Z = f(X, Y)
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis', edgecolor='none')

曲面三角剖分技术

在某些应用场景中,上述方法所要求的均匀采样网格数据往往过于严格且难以实现。此时,可以采用三角剖分技术来绘制部分图形,以解决非均匀数据的问题。


theta = 2 * np.pi * np.random.random(1000)
r = 6 * np.random.random(1000)
x = np.ravel(r * np.sin(theta))
y = np.ravel(r * np.cos(theta))
z = f(x, y)

ax = plt.axes(projection='3d')
ax.scatter(x, y, z, c=z, cmap='viridis', linewidth=0.5)


#上图还有许多地方需要修补,这些工作可以由ax.plot_trisurf函数帮助我们完成。它首先找到一组所有点都连接起来的三角形,然后用这些三角形创建曲面
ax = plt.axes(projection='3d')
ax.plot_trisurf(x, y, z, cmap='viridis', edgecolor='none')

莫比乌斯带的绘制(应用曲面三角剖分)


#绘制莫比乌斯带
#由于它是一条二维带,因此需要两个内在维度。theta维度取值范围是0~2pi,宽度维度w取值范围是-1~1
theta = np.linspace(0, 2 * np.pi, 30)
w = np.linspace(-0.25, 0.25, 8)
w, theta = np.meshgrid(w, theta)
phi = 0.5 * theta
#x-y平面内的半径
r = 1 + w * np.cos(phi)

x = np.ravel(r * np.cos(theta))
y = np.ravel(r * np.sin(theta))
z = np.ravel(w * np.sin(phi))

#要画出莫比乌斯带,还必须保证三角部分是正确的。最好的方法是首先用基本参数化方法定义三角部分,然后用Matplotlib将
#这个三角剖分映射到莫比乌斯带的三维空间里
from matplotlib.tri import Triangulation
tri = Triangulation(np.ravel(w), np.ravel(theta))
ax = plt.axes(projection='3d')
ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap='viridis', linewidth=0.2)
ax.set_xlim(-1, 1);ax.set_ylim(-1,1);ax.set_zlim(-1,1)

本文关于 Matplotlib 绘制三维图的示例代码介绍到此结束。如需了解更多 Matplotlib 三维图相关内容,建议搜索本站历史文章或继续阅读后续文章,感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表