PyQt5中嵌入matplotlib

文章介绍了如何使用Python的GUI库PyQt5和matplotlib来创建一个GUI应用,其中包含一个可以绘制图像的窗口。首先通过QtDesigner设计界面布局,然后将matplotlib的FigureCanvas组件添加到GUI中,用draw()方法替代show()来在GUI内显示图像。文章提供了详细的步骤,包括从.ui文件转.py文件,以及添加绘图功能的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天想做一个python GUI中嵌入matplotlib图像的程序,在网上也搜了很多博客,主要是绘制出来图像在布局上的位置问题不太清楚,今天就整理了一下。

其实绘制图像就相当于一个Widget组件,我们把他添加到Layout布局中就可以。然后具体的绘制图像就跟平时使用plot绘制大差不差,只是我们最终不是使用show()方法展示,而是使用draw()方法将图像展示到GUI界面中。

首先打开QtDesigner,创建一个Main Window窗口

在这里插入图片描述

可以自己拖动左边的组件,我这里简单添加了几个组件和按钮

在这里插入图片描述

接着可以设置布局,设置好布局之后放大缩小窗口的大小,里面组件的大小也会跟着改变,我自己一般使用的是垂直布局和水平布局较多,在QtDesigner中,按住Ctrl选择组件,然后点右键选择布局,一般在同一行的选择水平布局。
在这里插入图片描述

接着设置整体窗口的布局,在QtDesigner的右上角,选择最外层的MainWindow点击右键选择垂直布局

在这里插入图片描述

最后设置完大概是这个样子,看着有点怪,不过我们导出后一会还会手动添加画图的Widget组件,先ctrl+s保存文件,导出的是一个.ui文件
在这里插入图片描述

我们打开pycharm,将.ui文件转换为.py文件,在存放.ui文件的文件夹上点击右键选择Open in Terminal打开命令行。
在这里插入图片描述

输入命令pyuic5 -o qt_plt.py qt_plt.ui,qt_plt.ui是ui文件名称,qt_plt.py是要导出的.py文件的名称

在这里插入图片描述

修改.py文件中的代码

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'qt_plt.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
import matplotlib
import sys
import numpy as np


matplotlib.use('Qt5Agg')
# 使用 matplotlib中的FigureCanvas (在使用 Qt5 Backends中 FigureCanvas继承自QtWidgets.QWidget)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(720, 585)
        # 1. 创建画板组件
        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        # GUI界面总体的垂直布局
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        # 将按钮加入垂直布局中
        self.verticalLayout.addWidget(self.pushButton_2)
        # 将画板组件加入到垂直布局中  放在按钮下方
        self.verticalLayout.addWidget(self.canvas)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 720, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        # 连接点击事件到按钮上
        self.pushButton_2.clicked.connect(self.plot_)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "打开文件"))
        self.pushButton.setText(_translate("MainWindow", "选择"))
        self.pushButton_2.setText(_translate("MainWindow", "绘制"))
    # 定义绘制的方法
    def plot_(self):
        # 绘制双柱状图
        A_means_score = [0.710, 0.765, 0.798, 0.762]
        B_means_score = [0.84, 0.892, 0.902, 0.895]
        index = np.arange(4)
        bar_width = 0.35
        plt.bar(index, A_means_score, bar_width,  # A班x轴数据起始位置为index序列
                alpha=0.4, color='b', label='DIA_RED')
        plt.bar(index + bar_width, B_means_score, bar_width,  # B班x轴起始位置与A班数据错开
                alpha=0.4, color='r', label='DIFS-FI')
        x_labels = ['NBC', 'C4.5', 'SVM', 'KNN']
        plt.xticks(index + bar_width / 2, x_labels)  # index+bar_width/2 使得标签居中显示
        plt.legend()
        # 将之前的plt.show() 改成self.canvas.draw()
        self.canvas.draw()
# 运行程序
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    main_window = Ui_MainWindow()
    w = QtWidgets.QMainWindow()
    main_window.setupUi(w)
    w.show()
    app.exec()

点击绘制按钮之后的结果
在这里插入图片描述

要在PyQt5嵌入Matplotlib图形,可以使用`FigureCanvas`类和`NavigationToolbar`类。以下是一个简单的示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建一个Matplotlib图形 self.figure = Figure() self.canvas = FigureCanvas(self.figure) # 创建一个导航工具栏 self.toolbar = NavigationToolbar(self.canvas, self) # 创建一个垂直布局,并将图形和工具栏添加进去 layout = QVBoxLayout() layout.addWidget(self.canvas) layout.addWidget(self.toolbar) # 创建一个QWidget作为主窗口的中心部件 widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) # 绘制Matplotlib图形 self.plot() def plot(self): # 在Matplotlib图形上绘制一些内容 ax = self.figure.add_subplot(111) ax.plot([1, 2, 3, 4], [1, 4, 9, 16]) ax.set_title('Matplotlib Plot') ax.set_xlabel('X-axis') ax.set_ylabel('Y-axis') self.canvas.draw() if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) ``` 在这个示例中,我们创建了一个`MainWindow`类作为主窗口,并在其中嵌入了一个Matplotlib图形。我们使用`FigureCanvas`类将Matplotlib图形添加到PyQt5窗口中,并使用`NavigationToolbar`类添加一个导航工具栏。然后,我们在`plot`方法中绘制了一个简单的Matplotlib图形。 要运行这个示例,确保你已经安装了PyQt5Matplotlib库,并将以上代码保存在一个Python脚本文件中,然后运行该脚本即可看到嵌入Matplotlib图形的PyQt5窗口。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值