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

PyQt5快速开发与实战

文章目录

*
PyQt5快速开发与实战

+ 9. 第9章 PyQt5 扩展应用
+
* 9.4 Matplotlib在PyQt中的应用
*
9.4.1 对MatplotlibWidget的解读
9.4.2 设置提升的窗口控件
9.4.3 MatplotlibWidget的使用
9.4.4 更多扩展

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

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

'''绘制静态图,可以在这里定义自己的绘图逻辑'''

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秒重新绘制一次图像。

'''启动绘制动态图'''

def start_dynamic_plot(self, *args, **kwargs):
    timer = QtCore.QTimer(self)
    timer.timeout.connect(self.update_figure)
    timer.start(1000)

'''动态图的绘图逻辑可以在这里修改'''

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. 封装绘图类

这部分主要是使用 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_ntb = NavigationToolbar(self.mpl, self)

        self.layout.addWidget(self.mpl)
        self.layout.addWidget(self.mpl_ntb)

PyQt5快速开发与实战 9.4 Matplotlib在PyQt中的应用
9.4.2 设置提升的窗口控件

新建QWidget类,并将其提升

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

对窗口进行布局设置

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

编辑窗口,ui转py

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

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

PyQt5快速开发与实战 9.4 Matplotlib在PyQt中的应用
; 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_())

PyQt5快速开发与实战 9.4 Matplotlib在PyQt中的应用
9.4.4 更多扩展

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

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

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

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

Original: https://blog.csdn.net/weixin_44226181/article/details/126081369
Author: Ding Jiaxiong
Title: PyQt5快速开发与实战 9.4 Matplotlib在PyQt中的应用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/769663/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球