参考this post:我一直在尝试运行以下代码来绘制图表并实时更新图表。但是,每次尝试运行该函数时,我都会受到以下错误的欢迎: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,但我没有成功实现这一点。我有什么问题吗?什么产生了这个错误,我该如何解决?
这仅用于示例,不会复制到我的代码中。我只是将它用作参考资料,并认为这是与社区沟通问题的最简单方法。我不赞成以前的代码。
答案 0 :(得分:3)
正如Joe Kington所指出的:情节会返回您想要第一个元素的艺术家列表:
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。
答案 1 :(得分:0)
这样做的成语是:
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()
返回一对值,这不是真的。)