Matplotlib - 滚动事件
通常,scroll event(滚动事件)发生在用户与鼠标滚轮交互时。鼠标中间的滚轮用于在不使用文档或网页右侧垂直滚动条的情况下上下滚动页面。在本教程中,我们将探讨 Matplotlib 中的滚动事件处理。
Matplotlib 中的滚动事件
Matplotlib 通过 MouseEvent class(鼠标事件类)提供处理滚动事件的机制。此 scroll_event 事件在用户滚动鼠标滚轮时触发,用于提供交互式导航或图表缩放的机制。
示例 - 处理滚动事件
以下是一个简单的示例,用于检测滚动事件并根据用户向上或向下滚动鼠标滚轮显示相应消息。
import matplotlib.pyplot as plt
import numpy as np
def on_scroll(event):
if event.button == 'up':
print('向上滚动事件已触发..')
elif event.button == 'down':
print('向下滚动事件已触发..')
# 创建 figure 和 axis
fig, ax = plt.subplots()
ax.text(0.13, 0.5, '在鼠标滚轮上滚动试试!', dict(size=20))
# 将 on_scroll 方法连接到 scroll_event
fig.canvas.mpl_connect('scroll_event', on_scroll)
plt.show()
输出
执行上述代码后,将得到以下输出 −
向上滚动事件已触发.. 向上滚动事件已触发.. 向下滚动事件已触发.. 向上滚动事件已触发.. 向下滚动事件已触发.. 向上滚动事件已触发.. 向上滚动事件已触发..
观看下面的视频,观察此滚动事件功能如何工作。
使用滚动事件缩放
Matplotlib 中的滚动事件可用于动态缩放图表。通过将滚动事件连接到可调用函数,用户可以动态调整图表中的视图。
示例 - 滚动缩放图表
下面是一个示例,演示如何使用滚动事件实现缩放功能。
import matplotlib.pyplot as plt
def zoom_factory(axs, base_scale=2.):
def zoom_fun(event):
# 获取当前的 x 和 y 限制
cur_xlim = axs.get_xlim()
cur_ylim = axs.get_ylim()
cur_xrange = (cur_xlim[1] - cur_xlim[0]) * 0.2
cur_yrange = (cur_ylim[1] - cur_ylim[0]) * 0.2
# 获取事件 x 位置
xdata = event.xdata
ydata = event.ydata
if event.button == 'up':
# 处理放大
scale_factor = 1/base_scale
elif event.button == 'down':
# 处理缩小
scale_factor = base_scale
else:
# 处理不可能发生的情况
scale_factor = 1
print(event.button)
# 设置新的限制
axs.set_xlim([xdata - cur_xrange*scale_factor,
xdata + cur_xrange*scale_factor])
axs.set_ylim([ydata - cur_yrange*scale_factor,
ydata + cur_yrange*scale_factor])
# 强制重绘
plt.draw()
# 获取感兴趣的 figure
fig = axs.get_figure()
# 将回调函数连接到 scroll_event
fig.canvas.mpl_connect('scroll_event', zoom_fun)
# 返回函数
return zoom_fun
# 示例用法
fig, axs = plt.subplots(figsize=(7, 4))
axs.plot(range(100))
scale = 1.5
f = zoom_factory(axs, base_scale=scale)
plt.show()
输出
执行上述程序后,您将得到以下图表,请滚动鼠标滚轮观察此图表的缩放效果 −
观看下面的视频,观察此滚动事件功能如何工作。

交互式图像滚动浏览
Matplotlib 中的滚动事件也可以用于交互式地滚动浏览一系列图像。这一功能在浏览多维数据集或图像集合时特别有用。
示例 - 滚动时更新图像
此示例创建一个 IndexTracker 类,使用滚动事件导航一系列 2D 切片。on_scroll 方法根据滚动方向调整索引,然后更新并显示图像。
import matplotlib.pyplot as plt
import numpy as np
class IndexTracker:
def __init__(self, axs, X):
self.index = 0
self.X = X
self.axs = axs
self.im = axs.imshow(self.X[:, :, self.index])
self.update()
def on_scrolling(self, event):
print(event.button, event.step)
increment = 1 if event.button == 'up' else -1
maxs_index = self.X.shape[-1] - 1
self.index = np.clip(self.index + increment, 0, maxs_index)
self.update()
def update(self):
self.im.set_data(self.X[:, :, self.index])
self.axs.set_title(
f'使用滚轮导航\n索引 {self.index}')
self.im.axes.figure.canvas.draw()
# 3D 数据
x, y, z = np.ogrid[-25:25:100j, -25:25:100j, 1:50:100j]
X = np.sin(x * y * z) / (x * y * z)
# 创建图形
fig, axs = plt.subplots()
tracker = IndexTracker(axs, X)
fig.canvas.mpl_connect('scroll_event', tracker.on_scrolling)
plt.show()
输出
执行上述程序后,您将看到以下图形,请滚动鼠标滚轮观察此示例的工作效果 −
up 1.0 up 2.0 down -1.0 down -2.0 down -1.0 up 1.0 up 1.0 down -1.0 down -1.0 up 1.0 up 3.0 down -1.0 down -3.0
观看下面的视频,观察此滚动事件功能的工作原理。
