【问题标题】:Matplotlib animation panning the x axisMatplotlib 动画平移 x 轴
【发布时间】:2017-03-25 00:06:55
【问题描述】:

我正在构建一个 PyQT4 gui,它绘制来自某个文件的点的散点图。现在,这些点在 .txt 文件中配对为 X,Y。基本上,X 数据是以毫秒为单位的时间,而 Y 是在特定时间发生的某个事件。我想创建一个动画 matplotlib 散点图,它将时间轴从 0 平移到时间 t,比如说 1000 ms,而时间(X)轴平移 100 ms 帧或部分。因此,在绘制这些点时,绘图似乎从 0 移动到时间 t。

数据样本如下图:

105.40000000000001  330.0
105.40000000000001  344.0
105.5   259.0
105.5   262.0
.........
.....

等等..

我正在尝试使用 matplotlib 的 FuncAnimation,它采用更新方法,我尝试将更多数据添加到散点图中。但是我如何以 100 毫秒的步长平移时间轴。

我尝试使用数据生成器,每次调用更新方法时都会产生下一个数据点,但是当点数更多时,时间轴会变慢。

这是我迄今为止尝试过的。

ani = animation.FuncAnimation(self.figure,self._upd_plot,self.data_gen,blit=False, interval=10, repeat=False)
def data_gen(self):
    for d in self.data:
        yield d

def init_ani(self):
    self.g = self.data_gen()

def _upd_plot(self,d):
    d = next(g)
    self.time.append(d[0])
    self.neu.append(d[1])
    self.scat.set_xdata(self.time)
    self.scat.set_ydata(self.neu)
    self.canvas.draw()

问题出在哪里? 任何帮助将不胜感激。请原谅我的英语不好

【问题讨论】:

  • 您不需要在动画代码中处理的self.canvas.draw()。我假设有更多关于这个的类代码被删除了? self.scat 是什么?见matplotlib.org/examples/animation/animate_decay.html
  • 是的,肯定有更多关于这个的类代码,我仍在努力。 self.scat 是对在 init 中完成的散点图初始化的引用,它使用空的 x 和 y 数据完成。
  • 那么你的意思是,如果只是设置绘图对象的数据,绘图就会用新的点更新?不重绘画布?
  • FuncAnimation 内置了重绘逻辑

标签: python animation matplotlib pyqt4 scatter-plot


【解决方案1】:

最好只处理那些绘制的点,而不是将它们附加到列表中,如果后者会减慢速度。

这是我如何想象这样一个平移动画情节的示例,它似乎工作正常。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation

class some():
    def __init__(self):
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111)
        self.line,  = self.ax.plot([],[], color="red", linestyle="-")
        self.scat, = self.ax.plot([],[], color="orange", marker="s", linestyle="")

        self.data = np.random.rand(1000)
        self.times = np.arange(1000)

        self.stepsize = 10
        self.showntimes = np.arange(self.stepsize)
        self.ax.set_ylim([0,1])
        self.ax.set_xlim([self.showntimes[0],self.showntimes[-1]])

        self.ani = animation.FuncAnimation(self.fig, self._upd_plot, blit=False, interval=60, repeat=False)
        plt.show()

    def _upd_plot(self,i):
        print i
        if i < len(self.data)-self.stepsize:
            self.scat.set_data(self.showntimes, self.data[i:i+self.stepsize])
            self.line.set_data(self.showntimes, self.data[i:i+self.stepsize].mean()*np.ones(len(self.showntimes)) )
            self.ax.set_xticklabels(self.times[i:i+self.stepsize])
        else:
            self.ani.event_source.stop()

if __name__ == '__main__':
    s = some()

【讨论】:

  • 非常感谢您的回复。嗯,它对于我正在构建的应用程序显示所有数据点很重要,因此这需要我在平移 x 轴时将数据附加到散点图。请原谅我的这个问题,因为我是 PyQT4 和 Python 的新手,self.scat,self.line, 末尾的逗号在声明中是什么意思?
  • 声明x, = [1,2,3] 意味着x1 而不是一个列表。由于 plot 返回一个行列表(在我们的例子中只有一个)并且我们只想在之后使用该行,line, = plt.plot(); line.set_data() 缺少lines = plt.plot(); lines[0].set_data()
  • 在我的示例中,我正在平移 x 轴。有别的意思吗?也许 panning 你的意思是滚动右轴限制,而不是左?
  • 好的,我知道了!感谢您提供非常有用的信息。不,不,平移我的意思是完全如你的例子所描绘的那样。就是这样,我的数据文件中的点数非常大,在某个特定的时间戳说 x = 600 毫秒,y 数据非常大,我的意思是许多点在该点收敛,因此轴的平移有点慢。
  • 另外,我想知道,因为从我认为的示例中,绘图正在 matplotlib 窗口中进行。但我将此动画嵌入到 PyQT4 GUI 窗口中。我可以采用相同的代码并将其放入我的 GUI 代码中吗?它会弹出另一个 matplotlib 窗口还是会在我的主 gui 窗口中绘图?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多