无法让Matplotlib绘制图形到画布上

3
从我对使用matplotlib的基本了解来看,您可以将所需的plt存储在某个“fig”中,然后使用canvas.draw()操作绘制该“fig”。如果是这样,那么我不应该有任何问题,但由于我确实遇到了问题,所以究竟发生了什么,如何在画布上得到结果呢?此外,我的最终目标是在QtPy窗口中显示此绘图。迄今为止的结果是,我可以获取窗口和画布显示,但画布为空。我一直在参考http://matplotlib.sourceforge.net/users/artists.html,感觉自己做得并不完全错误,但也许我忽略了一些微妙之处。以下是我参考的代码:
def drawThis(self):

        self.axes.clear()
        self.axes.grid(self.grid_cb.isChecked())
        self.fig = plt.figure(figsize=(11,7),dpi=self.dpi)
        file = fileList[selFile]
        valid = [sColumn]
        matrix = np.loadtxt(file, skiprows=1, usecols=valid)
        colCount = np.loadtxt(file, dtype=object)
        totalCols = colCount.shape[1]

        kdeData = np.array(matrix)
        dataRange = (Decimal(max(abs(kdeData))) / 10).quantize(1, rounding=ROUND_UP) * 10

        gkde = stats.gaussian_kde(kdeData)
        ind = np.linspace(-int(dataRange), int(dataRange), len(kdeData) * sSamples)
        kdepdf = gkde.evaluate(ind)

        ##plot histogram of sample
        plt.hist(kdeData, len(kdeData), normed=1, alpha=0.20)
        ##plot data generating density
        plt.plot(ind, stats.norm.pdf(ind), 'r', linewidth=0.8, label='DGP normal')
        ##plot estimated density
        plt.plot(ind, kdepdf, 'g', linewidth=0.8, label='kde')
        plt.title('KDE for '+ str(nameList[selFile]))
        plt.legend()

        self.fig.canvas.draw()
1个回答

2
我没有使用matplotlib的经验,但看了你的代码后,我想知道你是否正确地使用了pyplot?在我看来,你的代码是使用pyplot生成数据(你没有保留返回值),然后绘制它,但我认为它实际上并没有操作你的轴实例。
这里有一个我见过的matplotlib使用示例:Segfault using matplotlib with PyQt.. 在这个例子中,他直接创建了一个PyQt4 FigureCanvas,并直接将其绘制到轴实例上。
似乎pyplot.plot()方法可以使用figure和axis参数告诉它要使用哪个实例。我想,它可能没有使用你的轴,因为我在你的示例中看不到你如何创建轴本身。请查看这里的文档
我的猜测是你可能会尝试做这样的事情:
plt.plot(ind, kdepdf, 'g', axis=self.axis, linewidth=0.8, label='kde')

或者,确认您已经通过使用self.axis = plt.axis()创建了self.axis,甚至尝试直接使用轴实例进行所有绘图?


我认为我误解了在我制作的窗口中实例化图形的过程。实际上,我使用了您在示例中找到的代码的一部分来创建我正在做的事情,但我一直将我的绘图存储在plt而不是“self.axes”中,而后者实际上显示在画布上。感谢你提醒我没有使用使用pyplot生成的数据。最后意识到了这一点,谢谢。 - DamianJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接