Python条形图线段不断出现

时间:2014-01-27 04:13:55

标签: python animation matplotlib

我修改了strip chart example以制作动画移动线。但是每次我移动条形图时,前两个线段都会被重新绘制。如我的屏幕截图所示:

example1

但是,如果我点击图中的“保存”按钮并保存它,那么额外的线段就不存在了。 (注意,这些是两个不同的测试运行,具有不同的随机数据,但在我的屏幕上,当动画运行时,两个额外的段总是存在) example

它也不会立即在动画中绘制。前两个部分将绘制,然后它将显示在图上。这些值不在tdata或ydata的数据列表中。这是示例代码:

import numpy as np
from matplotlib.lines import Line2D
import matplotlib.pyplot as plt
import matplotlib.animation as animation


class Scope:
    def __init__(self, ax, maxt=5, dt=1):
        self.ax = ax
        self.dt = dt
        self.maxt = maxt
        self.tdata = []

        self.tdata.append(0)
        self.ydata = []
        self.ydata.append(20)
        self.line = Line2D(self.tdata, self.ydata)
        self.ax.add_line(self.line)
        self.ax.set_ylim(21, 24)
        self.ax.set_xlim(0, self.maxt)

    def update(self, y):
        lastt = self.tdata[-1]
        if lastt > self.tdata[0] + self.maxt: # reset the arrays
            self.tdata = [self.tdata[-1]]
            self.ydata = [self.ydata[-1]]
            self.ax.set_xlim(self.tdata[0], self.tdata[0] + self.maxt)
            self.ax.figure.canvas.draw()

        t = self.tdata[-1] + self.dt
        self.tdata.append(t)
        self.ydata.append(y)
        self.line.set_data(self.tdata, self.ydata)
        return self.line,


def fetchPrice():
    yield np.random.rand(1) + 23


fig, ax = plt.subplots()
scope = Scope(ax)

ani = animation.FuncAnimation(fig, scope.update, fetchPrice, interval=1000,
                              blit=True)

plt.show()

如果您对正在发生的事情以及如何解决问题有任何想法,请告诉我。感谢。

1 个答案:

答案 0 :(得分:0)

这是由错误的缩进造成的。 Dedent update中的行(请参阅以下代码中的<----标记行):

def update(self, y):
    lastt = self.tdata[-1]
    if lastt > self.tdata[0] + self.maxt: # reset the arrays
        self.tdata = [self.tdata[-1]]
        self.ydata = [self.ydata[-1]]
        self.ax.set_xlim(self.tdata[0], self.tdata[0] + self.maxt)
    self.ax.figure.canvas.draw()       # <---- 

    t = self.tdata[-1] + self.dt
    self.tdata.append(t)
    self.ydata.append(y)
    self.line.set_data(self.tdata, self.ydata)
    return self.line,