在 Matplotlib 中创建多色线条

PythonPythonBeginner
立即练习

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

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

简介

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

虚拟机使用提示

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL matplotlib(("Matplotlib")) -.-> matplotlib/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/DataScienceandMachineLearningGroup(["Data Science and Machine Learning"]) python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) matplotlib/BasicConceptsGroup -.-> matplotlib/importing_matplotlib("Importing Matplotlib") matplotlib/BasicConceptsGroup -.-> matplotlib/figures_axes("Understanding Figures and Axes") python/BasicConceptsGroup -.-> python/booleans("Booleans") python/DataStructuresGroup -.-> python/lists("Lists") python/DataStructuresGroup -.-> python/tuples("Tuples") python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/DataScienceandMachineLearningGroup -.-> python/numerical_computing("Numerical Computing") python/DataScienceandMachineLearningGroup -.-> python/data_visualization("Data Visualization") subgraph Lab Skills matplotlib/importing_matplotlib -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} matplotlib/figures_axes -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} python/booleans -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} python/lists -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} python/tuples -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} python/build_in_functions -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} python/importing_modules -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} python/numerical_computing -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} python/data_visualization -.-> lab-48836{{"在 Matplotlib 中创建多色线条"}} end

导入库

我们将首先为本实验导入必要的库。我们将导入 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 函数显示绘图。