複数系列
このレッスンでできるようになること。3店舗の推移を1枚の図に重ね、凡例で区別できるようになります。
店舗ごとに図を3枚並べても比較はできますが、目を左右に動かす分だけ読み取りが遅くなります。同じ縦軸で重ねてしまえば、どの店が上でどの店が下かが一目で分かります。重ねられるのは、縦軸の単位が同じもの同士だけです。金額と数量のように単位が違うものを同じ軸に重ねると、読み手を確実に誤解させます。
重ねる書き方は単純で、同じ ax に対して plot を繰り返すだけです。ここでは植物ごとの週別の平均の高さを重ねます。売上推移では店舗別に月の金額を合計してから描きます。
Python
for plant, part in records.groupby("植物"):
weekly = part.groupby("週")["高さ"].mean().sort_index()
ax.plot(weekly.index, weekly.values, label=plant)
ax.legend()groupby は for 文で回すと、グループのキーとそのグループの小さな DataFrame を順番に返してくれます。この形を覚えておくと、店舗ごとの処理を書くのがとても楽になります。
label= を渡し、最後に ax.legend() を呼ぶのが凡例の作り方です。label を付けずに legend だけ呼んでも何も出ません。逆に label を付けても legend を呼ばなければ表示されません。この2つは必ずセットです。日本語のラベルはそのまま表示できるので、渋谷店や横浜店をローマ字に直す必要はありません。
重ねるときに1つ落とし穴があります。店舗ごとに存在する月が違うと、線ごとに横軸の点の数がずれます。1月から6月まである渋谷店と、3月に開店した大宮店を重ねると、後者の線は途中から始まります。これは事実を正しく描いているのですが、読み手には「データが欠けている」と見えることがあります。開店時期が違うことを図の注記に書いておくと親切です。
読み返しも系列ごとに行います。ax.get_lines() は描いた順に線を返すので、線の数が店舗数と一致しているか、それぞれの線が持つ値が正しいかを確かめられます。ラベルは line.get_label() で取れます。3本描いたつもりが2本しか無いときは、ループの中で ax を作り直しているといった間違いに気づけます。
演習の日付変換と読み返しは準備済みです。_read_series(ax) は実際に描かれた線と凡例を調べる補助関数なので、先に自分で線を描く必要があります。
同じ軸に複数の線を重ねる形は、植物の高さの記録でも使えます。groupby を for 文で使うと、グループ名と小さな表が受け取れます。
Python
for plant, part in records.groupby("植物"):
ax.plot(part["日数"], part["高さ"], label=plant)
ax.legend()要件
- 日付と月の準備、ax の作成、線の読み返しはひな形のまま使う
- 店舗名の昇順でグループを取り出し、月別の金額合計を古い順に並べる
- 同じ ax に各店舗の線を plot で描き、label に店舗名を渡す
- 描画ループの後に ax.legend() を呼ぶ
- 店舗に売上が無い月は新しく補わず、その店舗に存在する月だけ描く
- legend_labels は実際の凡例から補助関数が読み返す。labels と同じ店舗名を同じ順に並べる