Matplotlib 跨度选择器

Beginner

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

简介

本实验将指导你如何使用 Matplotlib Span Selector 在轴上选择一个范围,并在另一个轴上绘制所选范围的详细视图。

虚拟机使用提示

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

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

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

导入所需库

首先,我们需要导入所需的库——numpymatplotlib

import numpy as np
import matplotlib.pyplot as plt

创建示例数据

我们现在将使用 numpy 创建一些用于绘图的示例数据。

## 为保证可重复性而固定随机数种子
np.random.seed(19680801)

x = np.arange(0.0, 5.0, 0.01)
y = np.sin(2 * np.pi * x) + 0.5 * np.random.randn(len(x))

创建图形和子图

我们现在将使用 matplotlib 创建一个包含两个子图的图形。

fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6))

在第一个子图上绘制数据

我们将在第一个子图上绘制示例数据。

ax1.plot(x, y)
ax1.set_ylim(-2, 2)
ax1.set_title('Press left mouse button and drag '
              'to select a region in the top graph')

定义一个回调函数

我们将定义一个回调函数,当使用跨度选择器(Span Selector)选中一个范围时,该函数将会被调用。

def onselect(xmin, xmax):
    indmin, indmax = np.searchsorted(x, (xmin, xmax))
    indmax = min(len(x) - 1, indmax)

    region_x = x[indmin:indmax]
    region_y = y[indmin:indmax]

    if len(region_x) >= 2:
        line2.set_data(region_x, region_y)
        ax2.set_xlim(region_x[0], region_x[-1])
        ax2.set_ylim(region_y.min(), region_y.max())
        fig.canvas.draw_idle()

创建一个跨度选择器

我们将使用 matplotlib.widgets.SpanSelector 创建一个跨度选择器对象。

span = SpanSelector(
    ax1,
    onselect,
    "horizontal",
    useblit=True,
    props=dict(alpha=0.5, facecolor="tab:blue"),
    interactive=True,
    drag_from_anywhere=True
)

在第二个子图上绘制数据

我们将在第二个子图上绘制所选范围的详细视图。

line2, = ax2.plot([], [])

显示绘图

现在我们将使用 matplotlib.pyplot.show() 来显示绘图。

plt.show()

总结

在这个实验中,我们学习了如何使用 Matplotlib 的跨度选择器在一个轴上选择一个范围,并在另一个轴上绘制所选范围的详细视图。我们还学习了如何创建一个跨度选择器对象,并定义一个回调函数来处理所选范围。