Matplotlib 3D 等高线图函数
在数学中,等高线就像地图上的 “等高线”,能用来表示山峰或山谷的高度。在三维图形中,3D 等高线图帮助我们:
- 更直观地观察一个曲面的 “形状” 和 “高度变化” 。
- 分析某个函数在不同区域的走势。
在 Matplotlib 中,我们可以使用以下 2 种函数在 3D 坐标系中绘制等高线图:
contour():绘制 “线条形式” 的等高线。contourf():绘制 “带填充颜色” 的等高线。
语法:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.contour(X, Y, Z, levels=None, *args, **kwargs)
ax.contourf(X, Y, Z, levels=None, *args, **kwargs)说明:
如果想要使用 3D 等高线图,我们需要先从 mpl_toolkits.mplot3d 导入 Axes3D 类,然后使用 add_subplot() 函数创建一个 3D 的子图,最后再调用 contour() 或 contourf() 函数来创建 3D 等高线图。
拿 contour() 函数来说,它接收以下参数(contourf() 函数类似)。
X 和 Y(必选):是一个二维数组,表示等高线上点的 x 和 y 坐标。通常通过 np.meshgrid() 函数创建。Z(必选):是一个二维数组,表示等高线上点的高度值,其维度必须与 X 和 Y 相同。levels(可选):定义要绘制的等高线的级别。可以是一个整数(表示要绘制的等高线数量),也可以是一个列表或数组(指定每个等高线的高度值)。如果为 None,Matplotlib 会自动选择合适的级别。*args,**kwargs(可选):其他传递给 contour() 或 contourf() 函数的位置参数和关键字参数,例如颜色、线型、透明度等。这些参数与 2D 等高线图的用法类似。
Matplotlib 3D 等高线图示例
接下来,我们通过几个简单例子来介绍一下 Matplotlib 是如何绘制 3D 等高线图的。
示例 1:绘制基本的 3D 等高线图
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 创建 x 和 y 的网格
num1 = np.arange(-5.0, 5.0, 0.1)
num2 = np.arange(-5.0, 5.0, 0.1)
X, Y = np.meshgrid(num1, num2)
Z = X**2 + Y**2
# 绘制 3D 等高线图
ax.contour(X, Y, Z)
# 设置标题和标签
ax.set_title('3D 等高线图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们首先创建了一个 3D 的子图,然后使用 NumPy 的 meshgrid() 函数生成了二维网格 X 和 Y,并定义了 Z 的计算方式,最后,再使用 ax.contour(X, Y, Z) 函数绘制了 3D 等高线图。
示例 2:绘制一个填充的 3D 等高线图
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 创建 x 和 y 的网格
num1 = np.arange(-5.0, 5.0, 0.1)
num2 = np.arange(-5.0, 5.0, 0.1)
X, Y = np.meshgrid(num1, num2)
Z = np.sin(np.sqrt(X**2 + Y**2))
# 绘制填充的 3D 等高线图
ax.contourf(X, Y, Z, cmap='coolwarm')
# 设置标题和标签
ax.set_title('3D 等高线图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
这个例子与上一个类似,不同的地方是这里我们使用的是 contourf() 函数。contourf() 函数会在等高线之间填充颜色,从而使得图表更容易理解数据的分布。
示例 3:自定义等高线级别和颜色
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 创建 x 和 y 的网格
num1 = np.arange(-5.0, 5.0, 0.1)
num2 = np.arange(-5.0, 5.0, 0.1)
X, Y = np.meshgrid(num1, num2)
Z = X * Y
# 定义等高线级别
levels = np.arange(-10, 10, 2)
# 绘制 3D 等高线,并自定义颜色
ax.contour(X, Y, Z, levels=levels, colors=['red', 'green', 'blue'])
# 设置标题和标签
ax.set_title('3D 等高线图')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们使用 np.arange(-10, 10, 2) 定义了等高线的级别,并使用 colors 参数指定了等高线的颜色列表。
Matplotlib 3D 等高线图案例
使用可视化的方式来展示地理学、环境科学等领域的数据非常重要,比如需要分析某个地区的海拔高度数据,此时我们可以使用 3D 等高线图来展示地形的起伏。
示例 4:3D 等高线图的实际应用
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# 创建 x (经度) 和 y (纬度) 的网格
x_lon = np.linspace(-10, 10, 100)
y_lat = np.linspace(-10, 10, 100)
X, Y = np.meshgrid(x_lon, y_lat)
# 模拟地形高度 Z,这里使用一个复杂的数学函数来模拟山峰和山谷
Z = np.sin(np.sqrt(X**2 + Y**2)) + np.cos(X) * np.sin(Y)
# 绘制 3D 等高线图,并设置颜色映射
ax.contour3D(X, Y, Z, 50, cmap='viridis')
# 设置标题和标签
ax.set_title('3D 等高线图:模拟地形')
ax.set_xlabel('经度')
ax.set_ylabel('纬度')
ax.set_zlabel('海拔高度')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们模拟了一个复杂的地形表面,其中 X 轴表示经度,Y 轴表示纬度,Z 轴表示海拔高度。这里使用一个复杂的数学函数来生成 Z 值,以模拟真实地形的起伏。
通过 ax.contour3D() 函数,我们可以将这个地形表面的等高线绘制出来,颜色映射 cmap='viridis' 使得海拔高度的差异一目了然。这个图表清晰地展示了地形的结构,例如山峰和山谷的位置。
