Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python条形图线段不断出现_Python_Animation_Matplotlib - Fatal编程技术网

Python条形图线段不断出现

Python条形图线段不断出现,python,animation,matplotlib,Python,Animation,Matplotlib,我已经修改了,制作了一个动画移动线。但是,每次我移动条形图时,前两条线段都会被重新填充。如我的屏幕截图所示: 然而,如果我点击图形上的“保存”按钮并保存它,那么额外的线段就不存在了。(注意,这是两个不同的测试运行,具有不同的随机数据,但在我的屏幕上,当动画运行时,两个额外的片段始终存在) 它也不会在动画中立即打印。前两段将打印,然后它将显示在打印上。这些值不在tdata或ydata的数据列表中。以下是示例代码: import numpy as np from matplotlib.lines

我已经修改了,制作了一个动画移动线。但是,每次我移动条形图时,前两条线段都会被重新填充。如我的屏幕截图所示:

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

它也不会在动画中立即打印。前两段将打印,然后它将显示在打印上。这些值不在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()

让我知道,如果你有什么想法是怎么回事,以及如何解决它。谢谢。

这是由于缩进错误造成的。删除
update
中的行(请参见
self.tdata[0]+self.maxt:#重置数组
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()文件#@user6972,根据:如果
blit=True
func
init\u func
应该返回一个要清除的绘图表。您的代码没有提供
init\u func
,似乎matplotlib重用
update
方法的第一个返回值来清除框架。@user6972,备选方案1:指定
blit=False
也为我解决了问题。@user6972,备选方案2:将附加的
init_func=lambda:(scope.line,)
传递到
FuncAnimation
也解决了问题。
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,