在PyQt中嵌入matplotlib颜色条
我正在用PyQt4开发一个应用程序,需要用Matplotlib显示图表。为此,我使用了以下代码,这段代码运行得很好:
self.PhaFig = fig.Figure() #Creation of the Figure
self.PhaBeamCanvas = FigureCanvasQTAgg(self.PhaFig) #Creation of the display canvas
self.AxesPhaInit = self.PhaFig.add_subplot(111, title = "Input beam phase", aspect = 'equal') #Creation of the axes object inside the Figure
imgPha = self.AxesPhaInit.imshow(self.wf_mask,extent =[-xx/2+xx/N,xx/2,-xx/2+xx/N,xx/2])
self.PhaFig.colorbar(imgPha) #adding a colorbar to the graph
self.PhaBeamCanvas.draw() #drawing on the canvas
这个图表会在按下按钮时更新。图表的更新运行得很顺利。但问题出在颜色条上。当绘制新的图表时,之前的颜色条没有被删除,而是和新的颜色条挨在一起。
我尝试过类似这样的代码:
self.PhaFig.delaxes(self.AxesPhaInit)
但是这样不行。图表被删除了,但颜色条没有被删除,接下来的图表显示也不再正常了。
有没有人有好的主意?
2 个回答
0
colorbar
(可以查看文档)有一个叫做 cax
的参数,这个参数用来指定颜色条应该放在哪个坐标轴上。默认情况下,它会“占用”图形中某个区域的空间,通常是颜色映射所在的坐标轴。
一旦你掌握了 Axes
对象,嵌入和不嵌入之间其实没有区别,所以我会用不嵌入的方式来演示(这其实就是预先嵌入,不过我有点跑题了)。
fig, (ax, cax) = plt.subplots(1, 2)
img = ax.imshow(np.random.rand(42, 42))
fig.colorbar(img, cax=cax)
你显然需要更合理地调整你的 cax
大小,还有其他一些 kwargs
参数可以帮助你做到这一点。
1
我想我来得有点晚,不过我找到了一种超级简单的方法来解决这个问题(我在自己的应用中也遇到了这个问题)。
每次你在pyqt应用中更新或重新绘制图表时,只需要调用:
self.PhaFig.clf()
然后再添加你的子图并进行绘制等等。
真是不可思议……就这么简单!使用clf可以通过清除之前的内容来刷新图形。
至少,这在我使用PyQt5时是有效的。