matplotlibで書いたグラフにラベルを付ける

matplotlibで久しぶりにグラフを描く。
複数の線を描くので、線ごとにラベルを付けたかったのだが、label='...'をplot(...)の中に加えるだけでは表示されず、あれこれ迷う。簡易コードを書いて2時間ぐらい奮闘し、やっとlegendで表示位置を指定しなければ書かれないことに気付く。
そういえば、過去にも同じことを悩んだことを思い出した。二度目だ。でも、三度目はないな。

テストするために作った簡易コードを示す。

import wx
import matplotlib
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg


class CheckerFrame:
    def __init__(self, pnl):
        self.p = pnl
        num = 1  # 色を指定するための数値
        figure = matplotlib.figure.Figure()
        self.canvas = FigureCanvasWxAgg(self.p, wx.ID_ANY, figure)
        self.plot1 = figure.add_subplot(211, xlabel='X', 
                                             ylabel='Y')
        self.nval = [1, 2, 3, 4, 5, 6, 7]
        self.rval = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]

        freq = ['1', '2', '3', '4', '5']
        clr = ['b','g','r','c','m','y','k']
        self.plot1.plot(self.nval, self.rval, '-', color=clr[num%len(clr)], 
                        label='[Hz]') # label=で文字列を指定
        self.plot1.legend(loc='upper right') # どこにラベルを表示するか。
        self.canvas.draw()

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        Frm = wx.Frame(None, -1, 'Title', size=(400, 300))
        self.p = wx.Panel(Frm, -1)

        CheckerFrame(self.p)
        
        Frm.Show()
        return True

app = MyApp()
app.MainLoop()

これで図を描くと、下のようになる。

ラベル位置は、locに文字列か数値を指定すればよい。指定できるのは下表の通り。

文字列 番号
upper right 1
upper left 2
lower left 3
lower right 4
right 5
center left 6
center right 7
lower center 8
upper center 9
center 10