在PyQt中嵌入matplotlib颜色条

0 投票
2 回答
3229 浏览
提问于 2025-04-17 22:56

我正在用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时是有效的。

撰写回答