Matplotlib 等高线图像

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 Python 的 Matplotlib 库创建等高线图像。等高线图像是一种可视化技术,它使用二维绘图来表示三维表面。等高线图像由等高线组成,等高线是连接表面上等值点的线,以及填充等高线,即等高线之间的区域。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库

在这一步中,你将导入创建等高线图像所需的库。

import matplotlib.pyplot as plt
import numpy as np

from matplotlib import cm

定义数据

在这一步中,你将定义要绘制的数据。该数据是一个表示表面的二维值数组。

## 默认的增量较大,因为这样速度快,并且能说明图像和等高线之间的正确配准。
delta = 0.5

范围 = (-3, 4, -4, 3)

x = np.arange(-3.0, 4.001, delta)
y = np.arange(-4.0, 3.001, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

创建等高线图像

在这一步中,你将使用 Matplotlib 的 contourcontourf 函数来创建等高线图像。

## 提高上限以避免截断误差。
levels = np.arange(-2.0, 1.601, 0.4)

norm = cm.colors.Normalize(vmax=abs(Z).max(), vmin=-abs(Z).max())
cmap = cm.PRGn

fig, _axs = plt.subplots(nrows=2, ncols=2)
fig.subplots_adjust(hspace=0.3)
axs = _axs.flatten()

cset1 = axs[0].contourf(X, Y, Z, levels, norm=norm,
                        cmap=cmap.resampled(len(levels) - 1))
## 这不是必需的,但对于颜色映射表,我们只需要级别数减 1。为避免离散化误差,可使用此数字或一个大数字,如默认值(256)。

## 如果我们想要线条和填充区域,需要分别调用 contour;不要尝试更改 contourf 返回的集合中多边形的边缘颜色或边缘宽度。
## 使用上一次调用的 levels 输出以确保它们相同。

cset2 = axs[0].contour(X, Y, Z, cset1.levels, colors='k')

## 我们实际上不需要虚线等高线来表示负区域,所以将它们关闭。

for c in cset2.collections:
    c.set_linestyle('solid')

## 在这里单独调用 contour 比设置颜色和线宽数组更容易。
## 我们绘制一条粗绿色线作为零等高线。
## 将零级别指定为仅包含 0 的元组。

cset3 = axs[0].contour(X, Y, Z, (0,), colors='g', linewidths=2)
axs[0].set_title('填充等高线')
fig.colorbar(cset1, ax=axs[0])


axs[1].imshow(Z, extent=extent, cmap=cmap, norm=norm)
axs[1].contour(Z, levels, colors='k', origin='upper', extent=extent)
axs[1].set_title("图像,原点 'upper'")

axs[2].imshow(Z, origin='lower', extent=extent, cmap=cmap, norm=norm)
axs[2].contour(Z, levels, colors='k', origin='lower', extent=extent)
axs[2].set_title("图像,原点 'lower'")

## 在这里我们将使用“nearest”插值来显示实际的图像像素。
## 请注意,等高线不会延伸到框的边缘。
## 这是有意的。Z 值在每个图像像素的中心(以下子图中的每个颜色块)定义,所以绘制等高线的域不会超出这些像素中心。
im = axs[3].imshow(Z, interpolation='nearest', extent=extent,
                   cmap=cmap, norm=norm)
axs[3].contour(Z, levels, colors='k', origin='image', extent=extent)
ylim = axs[3].get_ylim()
axs[3].set_ylim(ylim[::-1])
axs[3].set_title("来自 rc 的原点,y 轴反转")
fig.colorbar(im, ax=axs[3])

fig.tight_layout()
plt.show()

显示等高线图像

在这一步中,你将显示等高线图像。

fig.tight_layout()
plt.show()

总结

在这个实验中,你学习了如何使用 Python 的 Matplotlib 库创建等高线图像。你首先导入了必要的库,定义了要绘制的数据,创建了等高线图像,然后显示了该图像。等高线图像是一种有用的可视化技术,可用于通过二维绘图来表示三维表面。