如何检测平移和缩放动作在matplotlib导航栏?



我通过在python中创建自定义MplWidget来使用matplotlib画布和导航栏,如下所示:

from PyQt5.QtWidgets import QWidget, QVBoxLayout
from matplotlib.backends.backend_qt5agg import (FigureCanvasQTAgg as
FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure

class MplWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.canvas = FigureCanvas(Figure())
vertical_layout = QVBoxLayout()
vertical_layout.addWidget(self.canvas)
self.canvas.axes = self.canvas.figure.add_subplot(111)
self.setLayout(vertical_layout)
self.canvas.toolbar = NavigationToolbar(self.canvas, self)
self.layout().addWidget(self.canvas.toolbar)
self.layout().addWidget(self.canvas)
self.canvas.axes.grid(b=True, which='both', axis='both')
self.canvas.figure.set_tight_layout(True)

我想检测何时平移或缩放工具被切换。我发现:在matplotlib中,我如何捕获该事件"缩放工具"被选中了吗?根据这里的解决方案,我尝试了

self.canvas.toolbar.get_state()['_current_action']

或者仅仅是self.canvas.toolbar.get_state(),但是我得到错误:

AttributeError: 'NavigationToolbar2QT' object has no attribute 'get_state'

查看当前正在使用的操作似乎是一个非常基本的功能,所以我确信有一个简单的解决方案,但我似乎找不到它。

中放大

我找到了两个解决方案,但我不知道它们是否适用于所有类型的后端(我不是这方面的专家)。


第一个是轴相关的:

ax.get_navigate_mode()

它返回'PAN', 'ZOOM'或None。

(链接到文档)


第二个是数字相关的:

fig.canvas.toolbar.mode

它返回"平移/缩放"缩放"或";"。

(链接到NavigationToolbar2对象的源代码)