如何使FigureCanvas适应Panel?
我正在尝试使用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)
这个面板接着被添加到另一个面板中,它的大小是相对于其他正在添加的面板来决定的。虽然我对面板的外部大小很满意,但我就是无法让图形适应这个面板:
这个大面板上有很多爪子,应该被缩放以适应面板,同时保持它的长宽比。
所以我在想,为什么这个图形不能扩展以适应面板呢?
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')
这样无论小部件的形状如何,图像都会填满整个小部件。
如果不考虑自动的比例,这样的结果是: