Matplotlib 三维绘图

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm

绘制空间曲线

下面我们绘制圆柱螺旋线两个周期的图像,其参数方程如下:

$$ \begin{cases} x = \cos t \\ y = \sin t \\ z = \frac{1}{2 \pi} t \end{cases} $$

首先,我们先准备好数据。

t = np.linspace(0, 4*np.pi, 101)
x = np.cos(t)
y = np.sin(t)
z = t * 2 / np.pi

接下来我们创建绘图窗口和 Axes3D 对象,方法和二维是类似的,不过需要额外指定 subplot_kw 参数。subplot_kw 参数是一个参数集,绘制三维图像需要指定 projection 键的值为 3d

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})


直接调用 Axes3D 对象的 plot 方法就能绘制三维曲线。

ax.plot(x, y, z)
fig


绘制空间曲面

下面我们绘制双曲抛物面(马鞍面)$x^2 - y^2 = 2z$ 的图像。首先我们需要生成一个二维平面离散点集。

x = np.linspace(-10, 10, num=101)
y = np.linspace(-10, 10, num=101)
x, y = np.meshgrid(x, y)

然后将曲面方程转化为二元函数 $z = \frac {1} {2} (x^2 - y^2)$:

z = (x**2 - y**2) / 2

最后我们创建绘图窗口和 Axes3D 对象,调用 Axes3D 对象的 plot_surface 方法绘制空间曲面。

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
surf = ax.plot_surface(x, y, z)


ax.clear()

图像美化

使用 cmap 参数指定 Colormap 对象,它是一种渐变效果。Matplotlib 中内置了丰富的 Colormap

surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)
fig


添加颜色条:

fig.colorbar(surf, shrink=0.5)
fig


绘制三维条形图

下面我们来绘制阶梯形状的条形图。首先我们准备数据:

_x = np.arange(4)
_y = np.arange(4)
_xx, _yy = np.meshgrid(_x, _y)
x, y = _xx.ravel(), _yy.ravel()

其中,ravel 方法可以将任意多维数组展平为一维数组。这一步必不可少!

x, y
(array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]),
 array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]))

接下来,我们初始化条形图的底部和顶部值。底部都是 $0$,顶部则满足 $z = x + y$。初始化的方式采用根据已有形状创建。

条形图的宽度和深度两个参数其实就是主视图和左视图二维条形图的宽度。

top = x + y
bottom = np.zeros_like(top)
width = depth = 1

下面是一种创建 Axes3D 对象的另一种方法:

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


使用 Axes3D 对象的 bar3d 方法就可以绘制三维条形图。

ax.bar3d(x, y, bottom, width, depth, top)
fig


Previous