当前位置: 首页 > 知识库问答 >
问题:

使用PyQt5和Matplotlib制作动态图形

郦翰学
2023-03-14

我想读取数据并绘制动态图,所以我学习了使用PyQt5的matplotlib。我找到了一个例子,但它是针对PyQt4的。我将其修改为PyQt5,但它有一些问题,当我单击开始按钮时,它显示错误

回溯(最后一次调用):文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/matplotlib/backend_base.py”,第1305行,在_on_timer ret=func(*args,**kwargs)文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/matplotlib/animation/animation.py”,第1049行,步进静止=动画_步骤(self,*args)文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/matplotlib/animation.py”,第855行,在步骤self中_绘制下一帧(framedata,self.\blit)文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/matplotlib/animation.py”,第873行,绘制下一帧self_pre_draw(framedata,blit)文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/matplotlib/animation.py”,第886行,在pre_draw self中_blit_clear(自绘制艺术家、自绘制缓存)文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site packages/matplotlib/animation.py”,第926行,在blit_clear a.图中。帆布restore_region(bg_缓存[a])键错误:matplotlib。斧头_子地块。0x1067718d0处的AxesSubplot对象

这是我的密码,有人能帮我吗??

import sys, os, random
from PyQt5 import QtCore
from PyQt5.QtWidgets import *

import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.animation as animation

class MyMplCanvas(FigureCanvas):
    """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        # We want the axes cleared every time plot() is called
        self.axes.hold(False)

        self.compute_initial_figure()

        #
        FigureCanvas.__init__(self, fig)
        self.setParent(parent)

    def compute_initial_figure(self):
        pass

class AnimationWidget(QWidget):
    def __init__(self):
        QMainWindow.__init__(self)

        vbox = QVBoxLayout()
        self.canvas = MyMplCanvas(self, width=5, height=4, dpi=100)
        vbox.addWidget(self.canvas)

        hbox = QHBoxLayout()
        self.start_button = QPushButton("start", self)
        self.stop_button = QPushButton("stop", self)
        self.start_button.clicked.connect(self.on_start)
        self.stop_button.clicked.connect(self.on_stop)
        hbox.addWidget(self.start_button)
        hbox.addWidget(self.stop_button)
        vbox.addLayout(hbox)
        self.setLayout(vbox)

        self.x = np.linspace(0, 5*np.pi, 400)
        self.p = 0.0
        self.y = np.sin(self.x + self.p)
        self.line, = self.canvas.axes.plot(self.x, self.y, animated=True, lw=2)




    def update_line(self, i):
        self.p += 0.1
        y = np.sin(self.x + self.p)
        self.line.set_ydata(y)
        return [self.line]

    def on_start(self):
        self.ani = animation.FuncAnimation(self.canvas.figure, self.update_line,
                                 blit=True, interval=25)

    def on_stop(self):
        self.ani._stop()



if __name__ == "__main__":
    qApp = QApplication(sys.argv)
    aw = AnimationWidget()
    aw.show()
    sys.exit(qApp.exec_())

共有1个答案

屈昊天
2023-03-14

我尝试了你的代码,似乎唯一真正的问题发生在你点击开始两次而没有停止动画的时候。

解决这个问题的一个方法(不涉及动画情节的细节)是防止开始和停止按钮做任何不应该做的事情。

方法是向AnimationWidget类添加一个属性,该属性记录动画是否正在播放。所以把它放在AnimationWidget\uuuu init\uuuu方法中的某个地方:

self.playing = False

然后,将启动时的和停止时的方法更改为

def on_start(self):
    if self.playing:
        pass
    else:
        self.playing = True
        self.ani = animation.FuncAnimation(
            self.canvas.figure,
            self.update_line,
            blit=True, interval=25
        )

def on_stop(self):
    if self.playing:
        self.playing = False
        self.ani._stop()
    else:
        pass

这使得动画不会启动两次,并且不会出现错误和图形故障。

 类似资料:
  • 本文向大家介绍利用PyQt5+Matplotlib 绘制静态/动态图的实现代码,包括了利用PyQt5+Matplotlib 绘制静态/动态图的实现代码的使用技巧和注意事项,需要的朋友参考一下 代码编辑环境 Win10+(Pycharmm or Vscode)+PyQt 5.14.2 功能实现 静态作图:数据作图,取决于作图函数,可自行修改 动态作图:产生数据,获取并更新数据,最后刷新显示,可用于实

  • im使用pyqt5创建gui并使用matplotlib 但是当我尝试创建pyInster可执行文件时,它不起作用 我尝试了以下几种解决方案: 1-无法使用PyInstaller创建工作的PyQt5 Python可执行文件/ 2-在PyInstaller,为什么不会NumPy。随机的。作为模块的公共负载? 3-PyInstaller生成的可执行文件中出现Python SSL导入错误 我尝试使用cx\

  • 本文向大家介绍matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解,包括了matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解的使用技巧和注意事项,需要的朋友参考一下 学习python的道路是漫长的,今天又遇到一个问题,所以想写下来自己的理解方便以后查看。 在使用matplotlib的过程中,常常会需要画很多图,但是好像并不能同时展示

  • numpy.histogram()函数将输入数组和作为两个参数。 bin数组中的连续元素用作每个bin的边界。 Matplotlib 可以将直方图的数字表示转换为图形。 pyplot子模块的plt()函数将包含数据和数组的数组作为参数,并转换为直方图。

  • 问题内容: 我如何使用java中的jFree图表创建动态折线图,它显示之前2小时的数据,并且还提供一个空白区域,数据从当前时间开始显示2小时。例如,假设当前时间为4pm,那么图表将显示数据从下午2点到下午6点。图表从下午2点到下午4点显示一条线,从下午4点到下午6点提供空白,这是图表移动时的填充时间,表示该图表的尾部从中间开始并向右移动。类似股市图。 问题答案: 是的,您可以做到。几天前我也遇到了

  • 问题内容: 有没有办法直接使用字典中的数据来绘制条形图? 我的字典看起来像这样: 我期待 工作,但事实并非如此。 这是错误: 问题答案: 您可以通过首先绘制条形图然后设置适当的刻度来分两行进行: 请注意,倒数第二行应在python3中读取,因为它会返回一个生成器,而matplotlib无法直接使用该生成器。