【问题标题】:matplotlib - Figure object has no attribute 'plot'. Reference problemsmatplotlib - 图对象没有属性“绘图”。参考问题
【发布时间】:2018-10-24 21:46:44
【问题描述】:

我知道还有其他人在他们的特定背景下提出这个问题,但这些答案都没有让我更接近于弄清楚这一点。我正在尝试使用 matplotlib 中的一个类将绘图添加到图形中。

我正在尝试让该类将 Line2D 对象作为参数并对其进行一些解释 - 这是有效的。该类还注册了对绘图窗口上的鼠标单击事件的回调 - 这也有效。以下是不起作用的:

fig, ax = plt.subplots()
series, = ax.plot(x_data, y_data)
classthing = MyClass(series)
plt.show()

这是被实例化的类:

class MyClass:
    def __init__(self, series):
        self.series = series
        self.cid = series.figure.canvas.mpl_connect('button_press_event', self)

    def __call__(self, event):
        self.series.figure.plot([xdata], [ydata])  
        self.series.figure.canvas.draw()

在鼠标点击时,我想在我点击的图形上添加一个图。这与此处的示例非常相似:https://matplotlib.org/users/event_handling.html

这段代码成功地创建了绘图和对象,但显然我没有从正确的引用中调用 plot() 方法,因为我在倒数第二行得到标题错误。仅给定其中的 Line2D 对象,如何正确引用绘图对象?我在 OOP 方面几乎没有能力。

提前感谢您的帮助。

【问题讨论】:

  • 你不会在数字上作图。您绘制在图形中的轴上。

标签: python matplotlib


【解决方案1】:

您不能同时绘制 ax 并再次使用它。代码中的series 是一个Line2D 对象,它没有plot 属性。

您可以像这样将ax 对象添加到您的类中:

class MyClass:
    def __init__(self, series, fig):
        self.series = series
        self.figure = fig
        self.cid = self.figure.canvas.mpl_connect('button_press_event', self)

    def __call__(self, event):
        self.series.plot([xdata], [ydata])  
        self.figure.canvas.draw()

fig, ax = plt.subplots()
series = ax
classthing = MyClass(series)
classthing(some_event) # call your class

现在,由于您将ax 传递给class,因此您的调用将成功,但您仍需要将xdataydata 传递给您的调用。

由于画布绘制,您将调用 figure,因此您还需要将其传递到您的对象中。

【讨论】:

  • 感谢您的回复 - 我只需将 ax 传递给班级即可使其正常工作。关于面向事件的 Python 是如何工作的,我有很多不明白的地方。这个类的目的是在继续执行之前从用户那里收集一些输入数据,但是现在脚本只是立即完成,即使在类等待输入时也是如此。我需要找出如何强制我的脚本等待回调完成 x 次,但我想这是另一个问题。
  • 试试async - 但这将是一个更大的主题
猜你喜欢
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多