Matplotlib显示到PyQT5控件中

441 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

很多时候我们需要将我们的算法进行集成和展示,而仅依靠算法本身进行展示,有时候显得太单薄,此时我们常使用一个控件辅助进行,在窗体框架中可以编写相关的功能按键和结果显示面板,将算法的效果以成熟软件的形式进行展示,这样即能够避免算法演示的单调效果,同时又可以将我们的算法进行模块化分区,将不同的功能进行独立区分,使得算法拥有更好的健壮性。

但是,目前在python编程中我们尝试用Matplotlib库进行结果的展示,而这个库又是独立与窗口的存在,如果放弃使用matplotlib换为PyQT5里面的控件代价有点大,需要重写每一个结果展示模块,考虑到这方面带来的问题,PyQT5允许将Matplotlib库的结果嵌入到PyQT5的窗体中进行展示,同时保留该控件原来的操作方式,也就是说,之前可以用matplotlib进行鼠标坐标的实时显示、数据的缩放等,均可以无缝支持,这样极大的方便了嵌入的过程,下面直接通过一组代码了解嵌入过程。

import sys
import matplotlib
import time
matplotlib.use('Qt5Agg')
from PyQt5 import QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
from PyQt5.QtCore import QTimer

class plt2bitmap(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(plt2bitmap, self).__init__(fig)


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setWindowTitle('Show Matplotlib for PyQt5')
        sc = plt2bitmap(self, width=5, height=4, dpi=200)
        # 设置x、y轴的数据
        sc.axes.plot([0, 1, 2, 3, 4, 5, 6], [1.5, 7.5, 5, 4, 20, 16, 10])
        # 创建定时器
        self.timer = QTimer()
        # 创建toolbar控件
        toolbar = NavigationToolbar(sc, self)
        # 创建标签控件。用于显示左下角的系统时间
        self.labels = QtWidgets.QLabel(self)
        self.timer.start(1000)
        self.timer.timeout.connect(self.showLocaltime)
        # 创建垂直布局面板,并将创建的控件放到垂直布局中
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(toolbar)
        layout.addWidget(sc)
        layout.addWidget(self.labels)
        # 设置整个窗口布局并显示
        widget = QtWidgets.QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)
        self.show()

    # 槽函数,用于定时显示当前系统时间
    def showLocaltime(self):
        self.labels.setText(str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))))


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

为了直观了解代码,下面把运行截图一并放上,可以概览代码的功能。

image.png

图中左上角为窗体显示的标题,中间部分便是matplotlib库的显示结果,左下角部分为一个label,通过定时器实现当前系统时间的实时显示。在中间数据显示部分,可以按照之前对matplotlib控件图的使用习惯对其进行移动、缩放、图片报错等操作。本实例仅为简单的例子,具体功能实现可以借助本例进行代码嵌入,同时对于定时器的使用例子为了巩固之前的博客同时解决某些编程者对于定时器触发条件的疑惑,认为定时器必须通过外部按钮等事件函数进行触发的误区。