pyQt Matplotlib部件的实时数据更新

2 人关注

用Python 2.7编写,使用pyQt 4.8.5。

我怎样才能在pyQt中实时更新一个Matplotlib widget? 目前我正在对数据进行采样(目前是随机的.gauss),附加这个数据并绘制 - 你可以看到我每次都在清除数字并为每次调用重新绘制。

def getData(self):
    self.data = random.gauss(10,0.1)
    self.ValueTotal.append(self.data)
    self.updateData()
def updateData(self):
    self.ui.graph.axes.clear()
    self.ui.graph.axes.hold(True)
    self.ui.graph.axes.plot(self.ValueTotal,'r-')
    self.ui.graph.axes.grid()
    self.ui.graph.draw()

我的图形用户界面可以工作,但我认为这是实现这一目标的错误方法,因为它的效率很低,我相信我应该在绘图时使用 "动画调用"(?),尽管我不知道怎么做。

2 个评论
所以只有新的数据被添加,旧的数据保持不变?
嗨,Dilbert,我应该说--是的,在一定程度上,是对你问题的回答。我想保留(比如)前500个数据点,随着新数据的到来,我将删除最旧的数据。
python
pyqt
live
Harry Lime
Harry Lime
发布于 2014-05-27
1 个回答
sebastian
sebastian
发布于 2014-06-03
已采纳
0 人赞同

一个想法是在第一次绘图完成后只更新图形对象。 axes.plot 应该返回一个 Line2D 对象,其x和y数据你可以修改。

http://matplotlib.org/api/artist_api.html#matplotlib.lines.Line2D.set_xdata

因此,一旦你画好了线,就不要删除和画新的,而是修改现有的。

def updateData(self):
    if not hasattr(self, 'line'):
        # this should only be executed on the first call to updateData
        self.ui.graph.axes.clear()
        self.ui.graph.axes.hold(True)
        self.line = self.ui.graph.axes.plot(self.ValueTotal,'r-')
        self.ui.graph.axes.grid()
    else: