在 Matplotlib 中创建多色线条

Beginner

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

简介

在本实验中,我们将学习如何在 Matplotlib 中创建多色线条。我们将使用 LineCollection 函数创建一组线段,并根据它们的导数分别为其着色。我们还将学习如何使用边界规范为线段着色。

虚拟机使用提示

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

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

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

导入库

我们将首先为本实验导入必要的库。我们将导入 matplotlib.pyplotnumpy

import matplotlib.pyplot as plt
import numpy as np

创建数据

我们将创建一个 NumPy 数组 x,它包含在 0 到 3π之间均匀分布的 500 个值。我们还将创建另一个 NumPy 数组 y,它包含 x 中值的正弦值。最后,我们将创建一个 NumPy 数组 dydx,它包含 y 的一阶导数。

x = np.linspace(0, 3 * np.pi, 500)
y = np.sin(x)
dydx = np.cos(0.5 * (x[:-1] + x[1:]))

创建线段

我们将创建一组线段,以便能够分别为它们上色。我们将使用 NumPy 的 concatenate 函数,沿着第二个轴连接两个数组 points[:-1]points[1:]。然后,我们会将结果数组重塑为一个 N x 1 x 2 的数组,这样我们就可以轻松地将点堆叠在一起以获得线段。用于线集合的线段数组需要是 (线段数量) x (每条线段的点数) x 2(用于 x 和 y)。

points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

创建连续规范

我们将创建一个连续规范,用于将数据点映射到颜色。我们将使用 matplotlib.pyplot 中的 Normalize 函数,将 dydx 的值在其最小值和最大值之间进行归一化。然后,我们将使用 LineCollection 函数创建一组线段,并根据它们的导数分别为其着色。我们将使用 set_array 函数来设置用于颜色映射的值。

norm = plt.Normalize(dydx.min(), dydx.max())
lc = LineCollection(segments, cmap='viridis', norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)

创建一个颜色条

我们将创建一个颜色条来展示颜色与 dydx 值之间的映射关系。我们会使用 matplotlib.pyplot 中的 colorbar 函数来创建一个颜色条。

line = plt.gca().add_collection(lc)
plt.colorbar(line)

使用边界规范

我们将改为使用边界规范来为线段着色。我们将创建一个包含三种颜色(红色、绿色和蓝色)的 ListedColormap。然后,我们将创建一个边界为 -1、-0.5、0.5 和 1 的 BoundaryNorm,以及上述 ListedColormap。我们将使用 set_array 函数来设置用于颜色映射的值。

cmap = ListedColormap(['r', 'g', 'b'])
norm = BoundaryNorm([-1, -0.5, 0.5, 1], cmap.N)
lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)

创建一个子图

我们将创建一个子图来展示带颜色的线段。我们会使用 matplotlib.pyplot 中的 subplots 函数创建一个 2x1 的子图网格,并使用 sharexsharey 参数在子图之间共享 x 轴和 y 轴。

fig, axs = plt.subplots(2, 1, sharex=True, sharey=True)
line = axs[0].add_collection(lc)
fig.colorbar(line, ax=axs[0])

设置坐标轴范围

我们将为子图设置 x 轴和 y 轴的范围。

axs[0].set_xlim(x.min(), x.max())
axs[0].set_ylim(-1.1, 1.1)

显示绘图

我们将使用 matplotlib.pyplot 中的 show 函数来显示绘图。

plt.show()

总结

在本实验中,我们学习了如何在 Matplotlib 中创建多色线条。我们使用 LineCollection 函数创建一组线段,并根据它们的导数分别为其着色。我们还学习了如何使用边界规范为线段着色。我们使用 Normalize 函数将 dydx 值在其最小值和最大值之间进行归一化,并使用 ListedColormap 函数创建一个包含三种颜色(红色、绿色和蓝色)的颜色映射。我们使用 BoundaryNorm 函数创建一个边界为 -1、-0.5、0.5 和 1 的边界规范,以及上述 ListedColormap。最后,我们使用 subplots 函数创建一个 2x1 的子图网格,并使用 sharexsharey 参数在子图之间共享 x 轴和 y 轴。然后,我们使用 show 函数显示绘图。