matplotlib + wxpython no se ajusta correctamente con la leyenda

Tengo una figura de matplotlib incrustada en un marco de wxpython con algunos tamaños. Todo funciona bien hasta que incluyo una leyenda, pero luego parece que los medidores no están trabajando con la leyenda.

Incluso cuando redimensiono la ventana arrastrando a la esquina, la figura principal cambia de tamaño, pero solo se muestra el borde de la leyenda.

Es decir, tenga en cuenta que la leyenda no es visible en el 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()

Editar:
Para que una solución me sea útil, me gustaría que se vea bien cuando el programa dibuje la figura automáticamente, de modo que los parámetros de ajuste se puedan codificar en el programa o, por ejemplo, en un evento de cambio de tamaño de ventana, pero no Ajustado a mano para cada parcela. Las principales cosas que espero cambiar aquí son:1) las longitudes de las etiquetas (de, por ejemplo, de 1 a 25 caracteres),2) el tamaño de las ventanas (generalmente por el usuario arrastrando alrededor de la esquina, y3) El número de puntos y líneas. (Además, si importa, eventualmente, querré tener fechas en el eje inferior).

He puesto la leyenda fuera de los ejes para que no cubra ningún punto de datos, y prefiero que permanezca a la derecha de los ejes.

Estoy usando Python 2.6.6, wxPython 2.8.12.1 y matplotlib 1.1.0 y estoy atascado con estos por ahora.

Respuestas a la pregunta(1)

Su respuesta a la pregunta