Matplotlib 怎么处理滚动事件?

文章导读
Previous Quiz Next 通常,scroll event(滚动事件)发生在用户与鼠标滚轮交互时。鼠标中间的滚轮用于在不使用文档或网页右侧垂直滚动条的情况下上下滚动页面。在本教程中,我们将探讨 Matplotlib 中的滚动事件处理。
📋 目录
  1. Matplotlib 中的滚动事件
  2. 使用滚动事件缩放
  3. 交互式图像滚动浏览
A A

Matplotlib - 滚动事件



Previous
Quiz
Next

通常,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()

输出

执行上述代码后,将得到以下输出 −

scroll_event_ex1
向上滚动事件已触发..
向上滚动事件已触发..
向下滚动事件已触发..
向上滚动事件已触发..
向下滚动事件已触发..
向上滚动事件已触发..
向上滚动事件已触发..

观看下面的视频,观察此滚动事件功能如何工作。

scroll_event_ex1 gif

使用滚动事件缩放

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()

输出

执行上述程序后,您将得到以下图表,请滚动鼠标滚轮观察此图表的缩放效果 −

scroll_event_ex2

观看下面的视频,观察此滚动事件功能如何工作。

scroll_event_ex2 gif

交互式图像滚动浏览

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()

输出

执行上述程序后,您将看到以下图形,请滚动鼠标滚轮观察此示例的工作效果 −

scroll_event_ex3
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

观看下面的视频,观察此滚动事件功能的工作原理。

scroll_event_ex3 gif