Instead of getting your axes from the add_subplot method, you can create an axis object with explicit boundaries. Therefore, instead of
self.axes = self.figure.add_subplot(111)
using
self.axes = self.figure.add_axes([0,0,1,1])
Four digits are the left edge, the lower edge, the width and height of the axes in fractions of the width and height of the figure. [0,0,1,1] will expand the image to fit the entire figure. Of course, there are still problems with the aspect ratio. If you want to keep the aspect ratio of your image, it will not always fill the entire space of the widget (depending on the shape of the widget). If the proportions are alright, you can call im_show like this
self.axes.imshow(self.data, interpolation="quadric", aspect='auto')
which will make the image fill the widget, regardless of shape.
Without an automatic aspect ratio, this means:

source share