You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将matplotlib导航功能集成到PyQt5主窗口自定义工具栏

PyQt5 内置工具栏集成Matplotlib交互功能实现

核心逻辑

你不需要显示Matplotlib自带的NavigationToolbar组件,只需要在后台实例化该对象,其内置的所有交互方法都可以直接调用,绑定到你自定义的QAction上即可,不用重写交互逻辑。

完整实现代码

import sys
import matplotlib
matplotlib.use('Qt5Agg')
from PyQt5.QtWidgets import QToolBar, QMainWindow, QAction, qApp, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure

class MplCanvas(FigureCanvasQTAgg):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super(MplCanvas, self).__init__(fig)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.resize(800, 600)

        # 1. 初始化画布
        self.sc = MplCanvas(self, width=5, height=4, dpi=100)
        self.sc.axes.plot([0,1,2,3,4], [10,1,20,3,40])

        # 2. 后台实例化导航工具栏,不要添加到布局里,自然就不会显示
        self.mpl_toolbar = NavigationToolbar(self.sc, self)

        # 3. 自定义PyQt工具栏,添加所有需要的交互操作
        self.custom_toolbar = self.addToolBar('绘图工具')

        # 回到初始视图
        home_act = QAction(QIcon('home.png'), '回到初始视图', self)
        home_act.setShortcut('Ctrl+H')
        home_act.triggered.connect(self.home)
        self.custom_toolbar.addAction(home_act)

        # 后退到上一个视图
        back_act = QAction(QIcon('back.png'), '后退', self)
        back_act.setShortcut('Ctrl+Left')
        back_act.triggered.connect(self.back_to_previous_view)
        self.custom_toolbar.addAction(back_act)

        # 前进到下一个视图
        forward_act = QAction(QIcon('forward.png'), '前进', self)
        forward_act.setShortcut('Ctrl+Right')
        forward_act.triggered.connect(self.forward_to_next_view)
        self.custom_toolbar.addAction(forward_act)

        # 平移
        pan_act = QAction(QIcon('pan.png'), '平移', self)
        pan_act.setShortcut('Ctrl+P')
        pan_act.triggered.connect(self.left_button_pan)
        self.custom_toolbar.addAction(pan_act)

        # 框选缩放
        zoom_act = QAction(QIcon('zoom.png'), '缩放', self)
        zoom_act.setShortcut('Ctrl+Z')
        zoom_act.triggered.connect(self.zoom)
        self.custom_toolbar.addAction(zoom_act)

        # 调整子图参数
        subplot_act = QAction(QIcon('subplot.png'), '调整子图', self)
        subplot_act.setShortcut('Ctrl+S')
        subplot_act.triggered.connect(self.configure_subplots)
        self.custom_toolbar.addAction(subplot_act)

        # 编辑坐标轴参数
        axis_act = QAction(QIcon('axis.png'), '编辑坐标轴', self)
        axis_act.setShortcut('Ctrl+E')
        axis_act.triggered.connect(self.edit_axis)
        self.custom_toolbar.addAction(axis_act)

        # 保存图片
        save_act = QAction(QIcon('save.png'), '保存', self)
        save_act.setShortcut('Ctrl+Shift+S')
        save_act.triggered.connect(self.save_figure)
        self.custom_toolbar.addAction(save_act)

        # 布局只加画布即可,不需要加matplotlib自带的工具栏
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.sc)
        widget = QtWidgets.QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.show()

    # 各个功能直接调用后台导航栏的内置方法即可
    def home(self):
        self.mpl_toolbar.home()

    def back_to_previous_view(self):
        self.mpl_toolbar.back()

    def forward_to_next_view(self):
        self.mpl_toolbar.forward()

    def left_button_pan(self):
        self.mpl_toolbar.pan()

    def zoom(self):
        self.mpl_toolbar.zoom()

    def configure_subplots(self):
        self.mpl_toolbar.configure_subplots()

    def edit_axis(self):
        self.mpl_toolbar.edit_parameters()

    def save_figure(self):
        self.mpl_toolbar.save_figure()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

注意事项

  • 代码里的图标路径可以替换为你自己本地的图标文件路径,如果不需要图标可以去掉QIcon参数
  • 快捷键和操作名称可以根据自己的需求修改
  • 不需要的功能可以直接删掉对应的Action和方法即可

内容的提问来源于stack exchange,提问作者zezo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:39:01