如何使FigureCanvas适应Panel?

7 投票
1 回答
4745 浏览
提问于 2025-04-16 19:42

我正在尝试使用Matplotlib和wxPython来显示一些数据。我有一个图形(Figure),它被添加到一个FigureCanvasWxAgg中。然后,这个画布被放入一个BoxSizer中,并设置为wx.EXPAND|wx.ALL,而这个BoxSizer又通过SetSizerAndFit进行设置。

self.figure = Figure(None, dpi = 75)
self.displaycanvas = FigureCanvas(self, -1, self.figure)
self.axes = self.figure.add_subplot(111)
self.axes.imshow(self.data, interpolation="quadric")     

self.mainSizer = wx.BoxSizer()
self.mainSizer.Add(self.displaycanvas, 1, wx.EXPAND|wx.ALL, 5)
self.SetSizerAndFit(self.mainSizer)

这个面板接着被添加到另一个面板中,它的大小是相对于其他正在添加的面板来决定的。虽然我对面板的外部大小很满意,但我就是无法让图形适应这个面板:

enter image description here

这个大面板上有很多爪子,应该被缩放以适应面板,同时保持它的长宽比。

所以我在想,为什么这个图形不能扩展以适应面板呢?

1 个回答

6

你可以通过明确设置边界来创建一个坐标轴对象,而不是通过 add_subplot 方法来获取坐标轴。也就是说,别用下面这个:

self.axes = self.figure.add_subplot(111)

而是用这个:

self.axes = self.figure.add_axes([0,0,1,1])

这四个数字分别代表坐标轴的左边缘、底边缘、宽度和高度,都是以图形宽度和高度的比例来表示的。比如 [0,0,1,1] 就会把图像扩展到填满整个图形。当然,这样做可能会有比例失调的问题。如果你想保持图像的比例,那么图像可能不会总是填满整个小部件的空间(这取决于小部件的形状)。如果你可以接受比例的变化,可以这样调用 im_show:

self.axes.imshow(self.data, interpolation="quadric", aspect='auto')

这样无论小部件的形状如何,图像都会填满整个小部件。

如果不考虑自动的比例,这样的结果是:

在这里输入图片描述

撰写回答