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.