文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么在Pyqt中使用matplotlib实时画图案

2023-06-08 00:41

关注

怎么在Pyqt中使用matplotlib实时画图案?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

运行环境:

Python 3.7 + Matplotlib 3.0.2 + PyQt 5

matplot官网给的相应的例子:

import sysimport timeimport numpy as npfrom matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5if is_pyqt5():  from matplotlib.backends.backend_qt5agg import (    FigureCanvas, NavigationToolbar2QT as NavigationToolbar)else:  from matplotlib.backends.backend_qt4agg import (    FigureCanvas, NavigationToolbar2QT as NavigationToolbar)from matplotlib.figure import Figureclass ApplicationWindow(QtWidgets.QMainWindow):  def __init__(self):    super().__init__()    self._main = QtWidgets.QWidget()    self.setCentralWidget(self._main)    layout = QtWidgets.QVBoxLayout(self._main)    static_canvas = FigureCanvas(Figure(figsize=(5, 3)))    layout.addWidget(static_canvas)    self.addToolBar(NavigationToolbar(static_canvas, self))    dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3)))    layout.addWidget(dynamic_canvas)    self.addToolBar(QtCore.Qt.BottomToolBarArea,            NavigationToolbar(dynamic_canvas, self))    self._static_ax = static_canvas.figure.subplots()    t = np.linspace(0, 10, 501)    self._static_ax.plot(t, np.tan(t), ".")    self._dynamic_ax = dynamic_canvas.figure.subplots()    self._timer = dynamic_canvas.new_timer(      100, [(self._update_canvas, (), {})])    self._timer.start()  def _update_canvas(self):    self._dynamic_ax.clear()    t = np.linspace(0, 10, 101)    # Shift the sinusoid as a function of time.    self._dynamic_ax.plot(t, np.sin(t + time.time()))    self._dynamic_ax.figure.canvas.draw()if __name__ == "__main__":  qapp = QtWidgets.QApplication(sys.argv)  app = ApplicationWindow()  app.show()  qapp.exec_()

怎么在Pyqt中使用matplotlib实时画图案

上图中的散点为静止的,下面的图为动态的,类似行波,一直在行走,是应为用了**self._dynamic_ax.plot(t, np.sin(t + time.time()))**函数,但是这个和我想得实时画图不太一样,在项目中要根据生成的数据实时绘图,因此x轴的元素和y轴的元素个数是逐渐增加的。

通过阅读上述 _update_canvas 函数代码以及 dynamic_canvas.new_timer 可以使得每次调用_update_canvas是的相应的x的元素和y轴的元素增加更改后的代码如下:

import sysimport timeimport numpy as npfrom matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5if is_pyqt5():  from matplotlib.backends.backend_qt5agg import (    FigureCanvas, NavigationToolbar2QT as NavigationToolbar)else:  from matplotlib.backends.backend_qt4agg import (    FigureCanvas, NavigationToolbar2QT as NavigationToolbar)from matplotlib.figure import Figureclass ApplicationWindow(QtWidgets.QMainWindow):  def __init__(self):    super().__init__()    self._main = QtWidgets.QWidget()    self.setCentralWidget(self._main)    layout = QtWidgets.QVBoxLayout(self._main)    static_canvas = FigureCanvas(Figure(figsize=(5, 3)))    layout.addWidget(static_canvas)    self.addToolBar(NavigationToolbar(static_canvas, self))    dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3)))    layout.addWidget(dynamic_canvas)    self.addToolBar(QtCore.Qt.BottomToolBarArea,            NavigationToolbar(dynamic_canvas, self))    self._static_ax = static_canvas.figure.subplots()    t = np.linspace(0, 10, 501)    self._static_ax.plot(t, np.tan(t), ".")    self.x = [] #建立空的x轴数组和y轴数组    self.y = []    self.n = 0    self._dynamic_ax = dynamic_canvas.figure.subplots()    self._timer = dynamic_canvas.new_timer(      100, [(self._update_canvas, (), {})])    self._timer.start()      def _update_canvas(self):    self.n += 1    if self.n == 200:      #画200个点就停止,根据实际情况确定终止条件      self._timer.stop()       self._dynamic_ax.clear()    self.x.append(np.pi/100*self.n) #x加入一个值,后一个值比前一个大pi/100    xx = np.array(self.x)    # t = np.linspace(0, 10, 101)    # Shift the sinusoid as a function of time.    self._dynamic_ax.plot(xx, np.sin(xx))    self._dynamic_ax.set_xlim(0,7)    self._dynamic_ax.set_ylim(-1,1)    self._dynamic_ax.figure.canvas.draw()if __name__ == "__main__":  qapp = QtWidgets.QApplication(sys.argv)  app = ApplicationWindow()  app.show()  qapp.exec_()

怎么在Pyqt中使用matplotlib实时画图案

上面的图仍然静止,下面的可以实时显示

怎么在Pyqt中使用matplotlib实时画图案

补充:pyqtgraph实时绘图出现无法刷新问题

pyqtgraph实时绘图时,会概率出现无法实时刷新绘制图,原因是

while True:  ......  update()  # 通过 plotitem.setData()更新数据  ......

这里使用的是while循环,不断的更新数据概率出现绘图不刷新和操作不响应(最小化操作会高概率出现该问题)

解决方法1:

我使用的是PlotWidget,remove后再addwidget,然后再重新绘制

解决方法2:

不使用while循环,使用QTime定时器

t = QTimer()t.timeout.connect(self.update)t.start(10)

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯