pyqt5界面嵌入matplotlib生成的图像

问题

我们单独使用matplotlib工具包去画图,一般会使用import pyplot as pltplt.show()去显示图片。但如果程序是一个pyqt5的工具,它本身就有一个界面,这时用plt.show()去弹出一个额外的界面,用户交互会显得很不友好。
其实,我们可以把matplotlib画出来的图像嵌入到pyqt的界面窗口里。

方案

主要是使用matplotlib中的FigureCanvasQTAggFigure,还有NavigationToolbar2QT
下面举例,看代码

import sys
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QGridLayout


class MyFigureCanvas(FigureCanvas):
    """
    画布
    """
    def __init__(self):
        # 画布上初始化一个图像
        self.figure = Figure()
        super().__init__(self.figure)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.widget = QWidget(self)
        # 设置中心窗口
        self.setCentralWidget(self.widget)
        # 创建一个网格布局管理器
        self.layout = QGridLayout()
        self.figureCanvas = MyFigureCanvas()
        self.__draw_figure__()
        # 工具栏 用于操作图片
        self.navigationToolbar = NavigationToolbar2QT(self.figureCanvas, self)
        self.layout.addWidget(self.navigationToolbar, 0, 0, 1, 1)
        self.layout.addWidget(self.figureCanvas, 1, 0, 1, 1)
        self.widget.setLayout(self.layout)
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('figure嵌入pyqt界面样例')
        self.show()

    def __draw_figure__(self):
        # 下面的步骤和调用的方法和plot大致相同,这里我写一个简单的折线图
        self.axes = self.figureCanvas.figure.add_subplot(111)
        self.axes.set_title("line chart")
        self.axes.set_xlabel("x")
        self.axes.set_ylabel("y")
        x = range(2, 26, 2)
        y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
        self.axes.plot(x, y, color='red')


if __name__ == "__main__":
    app = QApplication(sys.argv)
    example = MainWindow()
    example.show()
    sys.exit(app.exec_())

效果截图:


截屏2020-04-01下午8.24.07.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容