pyqt matplotlib动态显示图

今天别人让我动态显示作图,他只会静态的,动态的不会,这里我分享我参考的demo代码:

import sys
import random
import matplotlib
matplotlib.use('Qt5Agg')

from PyQt5 import QtCore, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


class MplCanvas(FigureCanvas):

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


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
        self.setCentralWidget(self.canvas)

        n_data = 50
        self.xdata = list(range(n_data))
        self.ydata = [random.randint(0, 10) for i in range(n_data)]
        self.update_plot()

        self.show()

        # Setup a timer to trigger the redraw by calling update_plot.
        self.timer = QtCore.QTimer()
        self.timer.setInterval(100)
        self.timer.timeout.connect(self.update_plot)
        self.timer.start()

    def update_plot(self):
        # Drop off the first y element, append a new one.
        self.ydata = self.ydata[1:] + [random.randint(0, 10)]
        self.canvas.axes.cla()  # Clear the canvas.
        self.canvas.axes.plot(self.xdata, self.ydata, 'r')
        # Trigger the canvas to update and redraw.
        self.canvas.draw()


app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()

主要就是update_plot里面的东西啦,是不是很简单。

参考文献

[1].Plotting with Matplotlib. https://www.learnpyqt.com/courses/graphics-plotting/plotting-matplotlib/

### 回答1: 在PyQt中使用Matplotlib库进行绘时,如果需要刷新表的显示,可以使用以下方法: 1. 使用canvas.draw()方法:在绘完成后,可以调用canvas对象的draw()方法来刷新表的显示。这个方法会重新生成并更新绘像,然后显示在界面上。 2. 使用figure.canvas.draw_idle()方法:在绘完成后,可以调用figure对象的canvas属性的draw_idle()方法来刷新表的显示。这个方法会该方法会自动调用canvas.draw_idle()方法更新绘像。 3. 使用figure.canvas.update()方法:在绘完成后,可以调用figure对象的canvas属性的update()方法来刷新表的显示。这个方法会强制更新绘像,然后显示在界面上。 在以上方法中,一般推荐使用canvas.draw()或figure.canvas.draw_idle()来刷新表的显示,因为它们能够自动识别需要更新的区域,而不会重复绘制整个表。 需要注意的是,在使用以上方法进行表刷新时,需要确保已经在PyQt的事件循环中。可以使用QTimer的singleShot()方法来确保在事件循环中进行表的刷新,例如: ```python from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QTimer import matplotlib.pyplot as plt # 绘函数 def plot(): # 绘逻辑... # 初始化PyQt应用 app = QApplication([]) # 创建定时器 timer = QTimer() # 定时器到期时调用绘函数 timer.timeout.connect(plot) # 设置定时器时间间隔(毫秒) timer.setInterval(1000) # 启动定时器 timer.start() # 运行PyQt应用的事件循环 app.exec_() ``` 上述代码中,定时器每隔1秒(1000毫秒)会调用一次绘函数进行表刷新。这样可以在PyQt应用的事件循环中进行表的刷新,保证表能够实时更新。 ### 回答2: PyQt是Python的一个GUI(形用户界面)工具包,Matplotlib是一个常用的绘库。在使用PyQtMatplotlib进行形绘制时,我们可能需要实时刷新形来显示实时数据。 在PyQt中,可以使用QTimer定时器来实现定时刷新。首先,我们需要导入相应的库: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from PyQt5.QtCore import QTimer import matplotlib.pyplot as plt ``` 接下来,创建一个QMainWindow的子类,并在构造函数中进行一些初始化操作,例如创建一个QWidget和一个QVBoxLayout来放置Matplotlib绘制的形: ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Matplotlib Refresh Example") self.layout = QVBoxLayout() self.widget = QWidget() self.widget.setLayout(self.layout) self.setCentralWidget(self.widget) ``` 然后,我们可以在类中添加一个刷新函数,用于进行Matplotlib形绘制和更新: ```python def refresh(self): # 清除之前的形 plt.clf() # 进行新的绘制 plt.plot([1, 2, 3, 4], [1, 4, 9, 16]) plt.xlabel('x') plt.ylabel('y') # 更新形 plt.draw() ``` 最后,我们在类中添加一个定时器事件,用于定时调用refresh函数进行形刷新: ```python def timerEvent(self, event): if event.timerId() == self.timer.timerId(): # 调用刷新函数 self.refresh() else: super().timerEvent(event) ``` 在我们的主程序中,我们需要初始化QApplication,创建MainWindow的实例,并启动定时器进行形的刷新: ```python if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() # 创建定时器 timer = QTimer() timer.timeout.connect(window.refresh) timer.start(1000) # 设置刷新间隔 app.exec_() ``` 通过上述代码,我们可以实现Matplotlib形的实时刷新,频率为每秒一次。 以上是关于如何在PyQt中使用Matplotlib实现形的刷新的简要说明。需要注意的是,实际项目中可能会有更多细节和复杂性,具体的实现方式可能会根据具体需求有所变化。 ### 回答3: 在PyQt中使用Matplotlib时,刷新形的一种常见方法是使用`plt.draw()`函数。该函数用于重新绘制当前活动的形。但是,在PyQt中,我们不能直接使用`plt.draw()`函数,而是需要将它嵌入到Qt事件循环中。 例如,以下是一个使用PyQtMatplotlib绘制动态实时表的示例: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure import matplotlib.pyplot as plt import numpy as np class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建一个Matplotlib Figure对象 self.figure = Figure() # 创建一个FigureCanvas对象,并将Figure对象传递给它 self.canvas = FigureCanvas(self.figure) # 创建一个垂直布局,将FigureCanvas对象放入其中 layout = QVBoxLayout() layout.addWidget(self.canvas) # 创建一个QWidget对象,并将布局设置给它 widget = QWidget(self) widget.setLayout(layout) # 设置QWidget对象为主窗口的中央部件 self.setCentralWidget(widget) # 初始化Matplotlib形 self.ax = self.figure.add_subplot(111) self.x = np.linspace(0, 10, 100) self.line, = self.ax.plot(self.x, np.sin(self.x)) # 开始计时器,并设置每秒触发一次update函数 self.timer = self.startTimer(1000) def timerEvent(self, event): # 更新数据 self.x += 0.1 self.line.set_ydata(np.sin(self.x)) # 重新绘制形 self.canvas.draw() if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) ``` 在上面的示例中,我们创建了一个继承自QMainWindow的MainWindow类,并重写了timerEvent方法来更新数据和重新绘制形。在timerEvent方法中,我们先更新了数据(self.x)和形(self.line),然后调用了self.canvas.draw()方法来重新绘制形。 此外,我们还使用了startTimer方法创建了一个计时器,并设置每秒触发一次timerEvent方法。这样,我们就可以实现动态实时更新Matplotlib表的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值