Matplotlib Qt4 GUI编程 - 用等效的OO替换plt.figure()

时间:2016-12-06 02:06:50

标签: python-2.7 matplotlib qt4

我有一个使用Qt4 Designer制作的应用程序,它将matplotlib图插入到容器小部件中。

生成图形的代码来自另一个模块,obspy:

self.st.plot(fig = self.rawDataPlot)

https://docs.obspy.org/packages/autogen/obspy.core.stream.Stream.plot.html 通常,这将创建并显示st对象数据的matplotlib图,这是时间序列。当指定fig参数时,这会告诉self.st.plot绘制到现有的matplotlib图形实例。

我必须生成图形然后将其放置在GUI小部件中的代码是:

def addmpl(self, fig, layout, window):  # code to add mpl figure to Qt4 widget
    self.canvas = FigureCanvas(fig)
    layout.addWidget(self.canvas)
    self.canvas.draw()
    self.toolbar = NavigationToolbar(self.canvas, 
    window, coordinates=True)
    layout.addWidget(self.toolbar)

self.rawDataPlot = plt.figure()     # code to create a mpl figure instance  
self.st.plot(fig = self.rawDataPlot)  # plot time-series data to existing matplotlib figure instance
self.addmpl(self.rawDataPlot, self.mplvl, self.mplwindow)  # add mpl figure to Qt4 widget

我想要做的是实例化一个matplot数字(供self.st.plot使用)但是以一种避免使用plt.figure()的方式,因为我已经读过,这在使用面向对象时是不好的做法编程。

如果我用plt.figure()替换Figure()(来自matplotlib.figure.Figure()),我收到错误:

AttributeError: 'NoneType' object has no attribute 'draw'

按照目前的情况,如果我使用plt.figure(),应用程序运行正常,但是有一种干净的方法可以避免使用,对我的情况甚至是必要的吗?

PS,这里的代码片段取自更大的来源,但我认为它得到了重点..

1 个答案:

答案 0 :(得分:0)

原则上两种方法都应该有效。 假设导入正确,无论您设置self.rawDataPlot = plt.figure()还是self.rawDataPlot = Figure()都没有太大的区别。

因此,错误很可能是在self.st.plot()函数中触发的。 (通常,如果报告错误,请附加回溯。)

查看obspy.core.stream.Stream.plot的来源,有一个关键字参数

  

:param draw:如果为True,则会明确重新绘制图形画布,其中               确保现有数字是新鲜的。没什么区别               对于尚未显示的数字。               默认为True

这意味着显然绘图函数试图绘制画布,在提供Figure()的情况下尚未设置。

一个好的猜测是调用

self.rawDataPlot = Figure()
self.st.plot(fig = self.rawDataPlot, draw=False)

并查看问题是否仍然存在。