• PyQt5快速开发与实战 9.4 Matplotlib在PyQt中的应用


    PyQt5快速开发与实战

    9. 第9章 PyQt5 扩展应用

    9.4 Matplotlib在PyQt中的应用

    Matplotlib是 Python最著名的绘图库,它提供了一整套和 MATLAB相似的命令API,十分适合交互式进行制图。而且也可以方便地将它作为绘图控件,嵌入到GUI应用程序中。

    9.4.1 对MatplotlibWidget的解读
    1. 设置绘图类

      class MyMplCanvas(FigureCanvas):
          """FigureCanvas的最终的父类其实是QWidget。"""
      
          def __init__(self, parent=None, width=5, height=4, dpi=100):
      
              # 配置中文显示
              plt.rcParams['font.family'] = ['SimHei']  # 用来正常显示中文标签
              plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
      
              self.fig = Figure(figsize=(width, height), dpi=dpi)  # 新建一个figure
              self.axes = self.fig.add_subplot(111)  # 建立一个子图,如果要建立复合图,可以在这里修改
      
              self.axes.hold(False)  # 每次绘图的时候不保留上一次绘图的结果
      
              FigureCanvas.__init__(self, self.fig)
              self.setParent(parent)
      
              '''定义FigureCanvas的尺寸策略,这部分的意思是设置FigureCanvas,使之尽可能的向外填充空间。'''
              FigureCanvas.setSizePolicy(self,
                                         QSizePolicy.Expanding,
                                         QSizePolicy.Expanding)
              FigureCanvas.updateGeometry(self)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      定义绘制静态图函数(自定义)

      '''绘制静态图,可以在这里定义自己的绘图逻辑'''
      
      def start_static_plot(self):
          self.fig.suptitle('测试静态图')
          t = arange(0.0, 3.0, 0.01)
          s = sin(2 * pi * t)
          self.axes.plot(t, s)
          self.axes.set_ylabel('静态图:Y轴')
          self.axes.set_xlabel('静态图:X轴')
          self.axes.grid(True)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      定义绘制动态图函数,设置每隔1秒重新绘制一次图像。

      '''启动绘制动态图'''
      
      def start_dynamic_plot(self, *args, **kwargs):
          timer = QtCore.QTimer(self)
          timer.timeout.connect(self.update_figure)  # 每隔一段时间就会触发一次update_figure函数。
          timer.start(1000)  # 触发的时间间隔为1秒。
      
      '''动态图的绘图逻辑可以在这里修改'''
      
      def update_figure(self):
          self.fig.suptitle('测试动态图')
          l = [random.randint(0, 10) for i in range(4)]
          self.axes.plot([0, 1, 2, 3], l, 'r')
          self.axes.set_ylabel('动态图:Y轴')
          self.axes.set_xlabel('动态图:X轴')
          self.axes.grid(True)
          self.draw()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    2. 封装绘图类

    这部分主要是使用 QWidget 把上面的绘图类和工具栏封装到MatplotlibWidget中,只需调用 MatplotlibWidget这个类就可以实现绘图功能了。

    class MatplotlibWidget(QWidget):
        def __init__(self, parent=None):
            super(MatplotlibWidget, self).__init__(parent)
            self.initUi()
    
        def initUi(self):
            self.layout = QVBoxLayout(self)
            self.mpl = MyMplCanvas(self, width=5, height=4, dpi=100)
            # self.mpl.start_static_plot() # 如果你想要初始化的时候就呈现静态图,请把这行注释去掉
            #self.mpl.start_dynamic_plot() # 如果你想要初始化的时候就呈现动态图,请把这行注释去掉
            self.mpl_ntb = NavigationToolbar(self.mpl, self)  # 添加完整的 toolbar
    
            self.layout.addWidget(self.mpl)
            self.layout.addWidget(self.mpl_ntb)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 测试程序

      在这里插入图片描述

      野生的错误出现了

      直接把这行注掉

      在这里插入图片描述

    9.4.2 设置提升的窗口控件

    新建QWidget类,并将其提升

    在这里插入图片描述

    对窗口进行布局设置

    在这里插入图片描述

    编辑窗口,ui转py

    在这里插入图片描述

    这里可以发现出错了,把前一文件名改一下

    在这里插入图片描述

    9.4.3 MatplotlibWidget的使用

    初始化模型并主函数调用

    from PyQt5.QtCore import pyqtSlot
    from PyQt5.QtWidgets import QMainWindow, QApplication
    
    from matplotlib_pyqt import Ui_MainWindow
    
    
    class MainWindow(QMainWindow, Ui_MainWindow):
        """
        Class documentation goes here.
        """
    
        def __init__(self, parent=None):
            """
            Constructor
    
            @param parent reference to the parent widget
            @type QWidget
            """
            super(MainWindow, self).__init__(parent)
            self.setupUi(self)
            self.matplotlibwidget_dynamic.setVisible(False)
            self.matplotlibwidget_static.setVisible(False)
    
        @pyqtSlot()
        def on_pushButton_clicked(self):
            """
            Slot documentation goes here.
            """
            self.matplotlibwidget_static.setVisible(True)
            self.matplotlibwidget_static.mpl.start_static_plot()
    
    
        @pyqtSlot()
        def on_pushButton_2_clicked(self):
            """
            Slot documentation goes here.
            """
            self.matplotlibwidget_dynamic.setVisible(True)
            self.matplotlibwidget_dynamic.mpl.start_dynamic_plot()
    
    
    
    if __name__ == "__main__":
        import sys
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        app = QApplication(sys.argv)
        ui = MainWindow()
        ui.show()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在这里插入图片描述

    9.4.4 更多扩展

    https://matplotlib.org/stable/gallery/index.html

    在这里插入图片描述

    在这里插入图片描述

    根据示例代码修改MyMplCanvas类,实现更多交互。

  • 相关阅读:
    2512. 奖励最顶尖的 K 名学生
    利用pycharm命令行 上传文件到服务器
    JAVA 递归算法- 椰子汁5元一瓶,4个盖子可以换一瓶椰子汁,3个空瓶可以换一瓶椰子汁,那么 100 块钱可以喝多少瓶椰子汁,剩下瓶盖和空瓶各多少?
    oracle varchar2类型如何转化为date类型
    Go语言重新开始,Go Modules 的前世今生与基本使用
    PAT 1003 Emergency
    凭借渠道优势穿越风险?科大讯飞探索AI新应用场景
    决策树算法的一点基础知识补充
    Netty12-TCP粘包拆包
    Autosar MCAL-ADC详解(二)-基于Tc27x的cfg软件
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126081369