いくつかのサイザーを備えた wxpython フレームに埋め込まれた matplotlib の図があります。凡例を含めるまではすべて正常に機能しますが、サイザーは凡例を処理していないようです。
隅をドラッグしてウィンドウのサイズを変更しても、メインの図のサイズは変わりますが、凡例の端だけが表示されます。
つまり、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()
編集:
解決策が私にとって役立つようにするには、プログラムによって図が自動的に描画されるときに見栄えがするようにしたいので、調整パラメーターをプログラムでハードコーディングするか、たとえば、ウィンドウのサイズ変更イベントで、ただし、プロットごとに手動で調整することはありません。ここで変更する予定の主なものは次のとおりです。1)ラベルの長さ (たとえば、1 から 25 文字まで)、2)ウィンドウのサイズ (通常はユーザーが角をドラッグすることによる)、 3)の数ポイントとライン。(また、それが重要な場合は、最終的には、下の軸に日付を配置したいと考えています。)
凡例を軸の外側に配置して、データ ポイントをカバーしないようにしました。軸の右側にとどめたいと思います。
私は Python 2.6.6、wxPython 2.8.12.1、および matplotlib 1.1.0 を使用しており、今のところこれらにこだわっています。