matplotlib + wxpython nie zmienia rozmiaru poprawnie z legendą

Mam figurkę matplotlib osadzoną w ramce wxpython z kilkoma sizerami. Wszystko działa dobrze, dopóki nie dołączę legendy, ale wtedy rozmiary nie działają z legendą.

Nawet gdy zmieniam rozmiar okna, przeciągając w rogu, główna figura zmienia rozmiar, ale tylko krawędź legendy jest kiedykolwiek wyświetlana.

Oznacza to, że legenda nie jest widoczna w wxFrame.

import wx
import matplotlib as mpl
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as Canvas
from random import shuffle  

class PlotFrame(wx.Frame):

    def __init__(self):     

        wx.Frame.__init__(self, None, -1, title="Plot", size=(-1, -1))
        self.main_panel = wx.Panel(self, -1)
        self.plot_panel = PlotPanel(self.main_panel)

        s0 = wx.BoxSizer(wx.VERTICAL)
        s0.Add(self.main_panel, 1, wx.EXPAND)
        self.SetSizer(s0)
        self.s0 = s0

        self.main_sizer = wx.BoxSizer(wx.VERTICAL)        
        self.main_sizer.Add(self.plot_panel, 1, wx.EXPAND)        
        self.main_panel.SetSizer(self.main_sizer)       

class PlotPanel(wx.Panel):

    def __init__(self, parent, id = -1, dpi = None, **kwargs):
        wx.Panel.__init__(self, parent, id=id, **kwargs)
        self.figure = mpl.figure.Figure(dpi=dpi, figsize=(2,2))
        self.canvas = Canvas(self, -1, self.figure)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas,1,wx.EXPAND)
        self.SetSizer(sizer)
        sizer.SetMinSize((600, 500))
        self.sizer = sizer

def test(plot_panel):
    axes = plot_panel.figure.gca()
    for c in ['r', 'b', 'k']:
        vals = [20, 30, 40, 50, 80, 20, 50, 60, 70, 70, 80]
        shuffle(vals)
        axes.plot(range(len(vals)), vals, "-o", color=c, label=c*10)
    legend = axes.legend(loc='center left', bbox_to_anchor=(1.05, 0.5))
    return legend

if __name__=="__main__":
    app = wx.PySimpleApp()
    frame = PlotFrame()
    legend = test(frame.plot_panel)
    frame.Fit()
    print "legend frame pre show: ", legend.get_frame()
    frame.Show(True)
    print "legend frame post show:", legend.get_frame()
    frame.Fit()
    app.MainLoop()

Edytować:
Aby rozwiązanie było dla mnie użyteczne, chciałbym, aby wyglądało dobrze, gdy rysunek jest automatycznie rysowany przez program, więc parametry regulacji mogą być zakodowane na stałe w programie lub, na przykład, w przypadku zmiany rozmiaru okna, ale nie dostosowane ręcznie dla każdej działki. Najważniejsze rzeczy, które zamierzam tutaj zmienić:1) długości etykiet (od, powiedzmy, od 1 do 25 znaków),2) rozmiar okien (zwykle przez przeciąganie przez użytkownika za róg i3) liczba punktów i linii. (Ponadto, jeśli ma to znaczenie, w końcu będę chciał mieć daty na dolnej osi.)

Umieściłem legendę poza osiami, aby nie zakryła żadnych punktów danych, i wolałbym, aby pozostała po prawej stronie osi.

Używam Pythona 2.6.6, wxPython 2.8.12.1 i matplotlib 1.1.0 i na razie jestem z nimi związany.

questionAnswers(1)

yourAnswerToTheQuestion