python pyplot画图_Matplotlib / PyPlot中的快速实时绘图

首先,问题中发布的代码在我的机器上以7 fps运行,QT4Agg作为后端。

现在,正如在这里或这里的许多帖子中所建议的那样,使用blit可能是一种选择。虽然这篇文章提到blit导致强烈的内存泄漏,但我无法观察到。

我稍微修改了你的代码并比较了使用和不使用blit的帧速率。下面的代码给出了

没有blit运行时18 fps

快乐28 fps

码:

import time

from matplotlib import pyplot as plt

import numpy as np

def live_update_demo(blit = False):

x = np.linspace(0,50., num=100)

X,Y = np.meshgrid(x,x)

fig = plt.figure()

ax1 = fig.add_subplot(2, 1, 1)

ax2 = fig.add_subplot(2, 1, 2)

fig.canvas.draw()   # note that the first draw comes before setting data

h1 = ax1.imshow(X, vmin=-1, vmax=1, interpolation="None", cmap="RdBu")

h2, = ax2.plot(x, lw=3)

text = ax2.text(0.8,1.5, "")

ax2.set_ylim([-1,1])

if blit:

# cache the background

axbackground = fig.canvas.copy_from_bbox(ax1.bbox)

ax2background = fig.canvas.copy_from_bbox(ax2.bbox)

t_start = time.time()

k=0.

for i in np.arange(1000):

h1.set_data(np.sin(X/3.+k)*np.cos(Y/3.+k))

h2.set_ydata(np.sin(x/3.+k))

tx = 'Mean Frame Rate:\n {fps:.3f}FPS'.format(fps= ((i+1) / (time.time() - t_start)) )

text.set_text(tx)

#print tx

k+=0.11

if blit:

# restore background

fig.canvas.restore_region(axbackground)

fig.canvas.restore_region(ax2background)

# redraw just the points

ax1.draw_artist(h1)

ax2.draw_artist(h2)

# fill in the axes rectangle

fig.canvas.blit(ax1.bbox)

fig.canvas.blit(ax2.bbox)

# in this post http://bastibe.de/2013-05-30-speeding-up-matplotlib.html

# it is mentionned that blit causes strong memory leakage.

# however, I did not observe that.

else:

# redraw everything

fig.canvas.draw()

fig.canvas.flush_events()

plt.pause(0.000000000001)

#plt.pause calls canvas.draw(), as can be read here:

#http://bastibe.de/2013-05-30-speeding-up-matplotlib.html

#however with Qt4 (and TkAgg??) this is needed. It seems,using a different backend,

#one can avoid plt.pause() and gain even more speed.

live_update_demo(True) # 28 fps

#live_update_demo(False) # 18 fps

更新:

为了更快地绘图,可以考虑使用pyqtgraph。

正如pyqtgraph文档所说:“对于绘图,pyqtgraph不像matplotlib那样完整/成熟,但运行得更快。”

我将上面的例子移植到pyqtgraph。虽然它看起来有点难看,但它在我的机器上以250 fps运行。

总结一下,

matplotlib(没有blitting):18 fps

matplotlib(有blitting):28 fps

pyqtgraph:250 fps

pyqtgraph代码:

import sys

import time

from pyqtgraph.Qt import QtCore, QtGui

import numpy as np

import pyqtgraph as pg

class App(QtGui.QMainWindow):

def __init__(self, parent=None):

super(App, self).__init__(parent)

#### Create Gui Elements ###########

self.mainbox = QtGui.QWidget()

self.setCentralWidget(self.mainbox)

self.mainbox.setLayout(QtGui.QVBoxLayout())

self.canvas = pg.GraphicsLayoutWidget()

self.mainbox.layout().addWidget(self.canvas)

self.label = QtGui.QLabel()

self.mainbox.layout().addWidget(self.label)

self.view = self.canvas.addViewBox()

self.view.setAspectLocked(True)

self.view.setRange(QtCore.QRectF(0,0, 100, 100))

#  image plot

self.img = pg.ImageItem(border='w')

self.view.addItem(self.img)

self.canvas.nextRow()

#  line plot

self.otherplot = self.canvas.addPlot()

self.h2 = self.otherplot.plot(pen='y')

#### Set Data  #####################

self.x = np.linspace(0,50., num=100)

self.X,self.Y = np.meshgrid(self.x,self.x)

self.counter = 0

self.fps = 0.

self.lastupdate = time.time()

#### Start  #####################

self._update()

def _update(self):

self.data = np.sin(self.X/3.+self.counter/9.)*np.cos(self.Y/3.+self.counter/9.)

self.ydata = np.sin(self.x/3.+ self.counter/9.)

self.img.setImage(self.data)

self.h2.setData(self.ydata)

now = time.time()

dt = (now-self.lastupdate)

if dt <= 0:

dt = 0.000000000001

fps2 = 1.0 / dt

self.lastupdate = now

self.fps = self.fps * 0.9 + fps2 * 0.1

tx = 'Mean Frame Rate:  {fps:.3f} FPS'.format(fps=self.fps )

self.label.setText(tx)

QtCore.QTimer.singleShot(1, self._update)

self.counter += 1

if __name__ == '__main__':

app = QtGui.QApplication(sys.argv)

thisapp = App()

thisapp.show()

sys.exit(app.exec_())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值