Matplotlib不能识别set_xdata属性



参考这篇文章:我一直在尝试运行以下代码来绘制和实时更新图表。但是,每次尝试运行该函数时,都会出现以下错误:AttributeError: 'list' object has no attribute 'set_xdata'

函数的其余部分如下所示:

def getData(self):
    self.data = random.gauss(10,0.1)
    self.ValueTotal.append(self.data)
    #With value total being a list instantiated as ValueTotal = []
    self.updateData()
def updateData(self):
    if not hasattr(self, 'line'):
        # this should only be executed on the first call to updateData
        self.widget.canvas.ax.clear()
        self.widget.canvas.ax.hold(True)
        self.line = self.widget.canvas.ax.plot(self.ValueTotal,'r-')
        self.widget.canvas.ax.grid()
    else:
        # now we only modify the plotted line
        self.line.set_xdata(np.arange(len(self.ValueTotal)))
        self.line.set_ydata(self.ValueTotal)
    self.widget.canvas.draw()   

虽然这个代码起源于sebastian和Jake French,但我还没有成功地实现它。我做错了什么吗?是什么产生了这个错误,我该如何修复?

严格用于示例,不会复制到我的代码中。我只是将其用作参考材料,并认为这将是与社区沟通我的问题的最简单方式。前面的代码我没有功劳

正如Joe Kington所指出的:plot返回一个艺术家列表,您希望将其作为第一个元素:

self.line = self.widget.canvas.ax.plot(self.ValueTotal,'r-')[0]

那么,取列表的第一个元素,也就是实际的行

复制此行为的最小示例:

l = plt.plot(range(3))[0]
l.set_xdata(range(3, 6))
l = plt.plot(range(3))
l.set_xdata(range(3, 6))

第一个运行正常,第二个给出AttributeError。

这样做的习惯用法是:

x = np.arange(0,10,0.1)
l, = plt.plot(x,x*x)
l.set_xdata(range(3, 6))

它取Line2D列表的第一个元素,允许使用set_xdata()set_ydata()操作整个坐标列表。

注意,这不起作用:

x = np.arange(0,10,0.1)
l,_ = plt.plot(x,x*x)
l.set_xdata(range(3, 6))

(在许多代码示例中看到line, =的习惯用法,我曾经认为plot()返回一对值,这是不正确的)

最新更新