我有一个使用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,这里的代码片段取自更大的来源,但我认为它得到了重点..
答案 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)
并查看问题是否仍然存在。