【问题标题】:Matplotlib is not recognizing the attribute set_xdata.Matplotlib 无法识别属性 set_xdata。
【发布时间】:2014-08-10 04:02:27
【问题描述】:

参考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()   

虽然这段代码来自sebastianJake French,但我没有成功实现它。我做错了什么吗?是什么导致了这个错误,我该如何解决?

这仅用于示例,不会复制到我的代码中。我只是将其用作参考材料,并认为这是与社区交流我的问题的最简单方法。我不相信之前的代码。

【问题讨论】:

  • @sebastian 你对你提供的解决方案有什么意见吗?

标签: python matplotlib pyqt matplotlib-basemap


【解决方案1】:

正如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。

【讨论】:

  • 我想我明白你在说什么。出于好奇,set_xdata 是设置直线中单个点的 x 坐标吗?
  • @AndreScholich - 仅供参考:这不是 API 更改。 plot 总是返回一个艺术家列表,因为它可以用来绘制多条线。这更有可能是原始示例中的错字。
  • @sudobangbang - 不,它正在设置线上所有点的 x 坐标。 (注意一个序列被传递到set_xdata。)
  • 啊,我明白了!我已经让它工作了。出于好奇@JoeKington 有没有一种方法可以在图形窗口上设置边界?例如,如果我想每秒查看文件,但 x 轴只会以 10 秒的间隔显示。现在它似乎在无限扩张。 (并且当 xaxis 为 2500 秒时尝试查看 1 秒的数据时,它有点费力)
  • @sudobangbang - 交互式缩放或使用xlim。 (例如plt.xlim([min, max])ax.set_xlim([min, max])
【解决方案2】:

这样做的习惯用法是:

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()返回一对值,这是不正确的)。

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多