解决matplotlib嵌入PyQt5画图时的图片刷新问题

解决matplotlib嵌入PyQt5画图时的图片刷新问题(1)

matplotlib画图可以嵌入到PyQt5控件TabWidget、GroupBox和QGraphicsView视图窗口显示图形。当重新画图时,需要在当前窗口显示重新画好的图。

在网上可以查到很多相关的资料和答案,但有些杂乱并且还是耗费了很多时间,问题解决后就记录一下解决这一问题的过程和代码示例。
matplotlib嵌入PyQt5画图
在这篇博文中(原文链接:https://blog.csdn.net/panrenlong/article/details/80183519),博主详细讲了如何把matplotlib嵌入PyQt5画图。下图是评论区的截图,都在讨论如何刷新图片,给出了解决方案,也是很多答案中的一种。但是在我的工作中并没work。
在这里插入图片描述
解决图片刷新问题
做一个简单的例子来说明一下解决方案。在goupBox中切换sin和cos图。
首先,绘制GUI,如下图。选择comBox中的值,以改变cos图的形状。实现在groupBox中显示不同的cos图。在这里插入图片描述
先附上完整代码,在说明讲解。
以下是完整代码。

import numpy as np
import sys
from PyQt5 import QtWidgets 
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib
import matplotlib.pyplot as plt
import sip
matplotlib.use("Qt5Agg")  # 声明使用QT5
class MyFigure(FigureCanvas):
    def __init__(self, width=8, height=2,dpi=100):
        # 第一步:创建一个创建Figure
        self.fig = Figure(figsize=(width, height), dpi=dpi)

        super(MyFigure, self).__init__(self.fig)
        self.ax=self.fig.add_subplot(111)

class Stats:
    step = 0
    def __init__(self):
        # 从文件中加载UI定义
        self.ui = uic.loadUi(".../csdn.ui")
        self.ui.pushButton.clicked.connect(self.plotcos)
        self.verticalLayout_1 = QtWidgets.QVBoxLayout(self.ui.groupBox)
        self.verticalLayout_1.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_1.setObjectName("verticalLayout_1")
        
    def myfunction(self):
        self.F = MyFigure(width=3, height=2, dpi=100)
        t = np.arange(0.0, int(self.ui.comboBox.currentText()), 0.01)
        s = np.cos(2 * np.pi * t)
        self.F.ax.plot(t, s)  
        if self.verticalLayout_1.count() < 2: 
            self.verticalLayout_1.addWidget(self.F) 

    def plotcos(self):
        self.step += 1
        if self.step == 1:
            self.myfunction()
        else:
            sip.delete(self.F)
            self.myfunction()       

if __name__ == '__main__':
    app = QApplication([])
    stats = Stats()
    stats.ui.show()
    sys.exit(app.exec_())

动态加载.ui文件,代码如下。

from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
import sys
class Stats:
    def __init__(self):
        # 从文件中加载UI定义
        self.ui = uic.loadUi(".../csdn.ui")
if __name__ == '__main__':
    app = QApplication([])
    stats = Stats()
    stats.ui.show()
    sys.exit(app.exec_())

首先,把matplotlib嵌入PyQt5。matplotlib.use("Qt5Agg") # 声明使用QT5,这段声明很重要。接着创建画图的类。这部分资源在网上很多,而且都比较统一固定。

class MyFigure(FigureCanvas):
    def __init__(self, width=8, height=2,dpi=100):
        # 第一步:创建一个创建Figure
        self.fig = Figure(figsize=(width, height), dpi=dpi)

        super(MyFigure, self).__init__(self.fig)
        self.ax=self.fig.add_subplot(111)

其次,就是给显示图片的控件添加布局来布局图片这一“控件”(理解这个很重要,也是很基础的东西)

self.verticalLayout_1 = QtWidgets.QVBoxLayout(self.ui.groupBox)
        self.verticalLayout_1.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_1.setObjectName("verticalLayout_1")

最后,刷新图片的最重要的操作、最有效地操作就是下面这段代码。sip.delete(self.F)删除图片“控件”,再来重新画图。step判断是否第一次画图,之前是否已有图片控件存在。

def plotcos(self):
        self.step += 1
        if self.step == 1:
            self.myfunction()
        else:
            sip.delete(self.F)
            self.myfunction()   

参考:https://blog.csdn.net/qq_40587575/article/details/85171401

  • 1
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在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、付费专栏及课程。

余额充值