Matplotlib 3D 等高线图

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()

运行之后,效果如下图所示。

Matplotlib 基本 3D 等高线图

分析:

在这个例子中,我们首先创建了一个 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()

运行之后,效果如下图所示。

Matplotlib 绘制填充的 3D 等高线图

分析:

这个例子与上一个类似,不同的地方是这里我们使用的是 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()

运行之后,效果如下图所示。

Matplotlib 自定义级别和颜色的 3D 等高线图

分析:

在这个例子中,我们使用 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()

运行之后,效果如下图所示。

Matplotlib 3D 等高线图的实际应用

分析:

在这个例子中,我们模拟了一个复杂的地形表面,其中 X 轴表示经度,Y 轴表示纬度,Z 轴表示海拔高度。这里使用一个复杂的数学函数来生成 Z 值,以模拟真实地形的起伏。

通过 ax.contour3D() 函数,我们可以将这个地形表面的等高线绘制出来,颜色映射 cmap='viridis' 使得海拔高度的差异一目了然。这个图表清晰地展示了地形的结构,例如山峰和山谷的位置。

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号