Matplotlib 标记自定义教程

PythonPythonBeginner
立即练习

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

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

简介

本教程将指导你使用 Line2Dmarkevery 属性在 Matplotlib 中的数据点子集处绘制标记。我们将介绍指定标记的各种方法,包括使用整数、元组、列表、切片和浮点数。我们还将探讨 markevery 在线性和对数刻度以及缩放图和极坐标图中的表现。

虚拟机使用提示

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

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

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

定义数据点

首先,我们定义将用于绘图的数据点。在这个例子中,我们使用 numpy 生成一组正弦波的 x 和 y 值。

import matplotlib.pyplot as plt
import numpy as np

## 定义要绘制的 markevery 情况列表
cases = [
    None,
    8,
    (30, 8),
    [16, 24, 32],
    [0, -1],
    slice(100, 200, 3),
    0.1,
    0.4,
    (0.2, 0.4)
]

## 数据点
delta = 0.11
x = np.linspace(0, 10 - 2 * delta, 200) + delta
y = np.sin(x) + 1.0 + delta

创建线性刻度的图表

接下来,我们创建一组子图,以展示 markevery 在线性刻度下的表现。我们遍历 cases 列表,并在单独的子图上绘制每个情况。我们使用 markevery 参数来指定要标记哪些数据点。

## 创建线性刻度的图表
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)

创建对数刻度的图表

我们重复上一步,但这次使用对数刻度。我们注意到,对数刻度会导致基于整数的子采样在标记距离上产生视觉上的不对称,而基于分数的子采样则会产生均匀分布。

## 创建对数刻度的图表
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.set_xscale('log')
    ax.set_yscale('log')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)

创建缩放图

我们创建另一组子图,这次是为了展示 markevery 在缩放图上的表现。我们注意到,基于整数的子采样从基础数据中选择点,并且与视图无关,而基于浮点数的子采样与轴对角线相关,并会改变显示的数据范围。

## 创建缩放图
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)
    ax.set_xlim((6, 6.7))
    ax.set_ylim((1.1, 1.7))

创建极坐标图

最后,我们创建一组子图来展示 markevery 在极坐标图上的表现。我们注意到其表现与在线性刻度上的表现类似。

## 创建极坐标图
r = np.linspace(0, 3.0, 200)
theta = 2 * np.pi * r

fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained',
                        subplot_kw={'projection': 'polar'})
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(theta, r, 'o', ls='-', ms=4, markevery=markevery)

总结

在本教程中,我们学习了如何使用 Line2Dmarkevery 属性在Matplotlib中的数据点子集处绘制标记。我们探索了指定标记的各种方法,包括使用整数、元组、列表、切片和浮点数。我们还了解了 markevery 在线性和对数刻度下,以及在缩放图和极坐标图上的表现。