複数系列
このレッスンでできるようになること。3店舗の推移を1枚の図に重ね、凡例で区別できるようになります。
店舗ごとに図を3枚並べても比較はできますが、目を左右に動かす分だけ読み取りが遅くなります。同じ縦軸で重ねてしまえば、どの店が上でどの店が下かが一目で分かります。重ねられるのは、縦軸の単位が同じもの同士だけです。金額と数量のように単位が違うものを同じ軸に重ねると、読み手を確実に誤解させます。
重ねる書き方は単純で、同じ ax に対して plot を繰り返すだけです。
Python
for store, part in df.groupby("店舗"):
monthly = part.groupby("月")["金額"].sum().sort_index()
ax.plot(monthly.index, monthly.values, label=store)
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 を作り直しているといった間違いに気づけます。
要件
- 売上日を日付型にしてから月を取り出す
- 1つの ax に対して店舗の数だけ plot を呼ぶ
- 各 plot に label を渡し、最後に ax.legend() を呼ぶ
- 月は古い順に並べてから描く
- labels と series は ax.get_lines() から読み返す
入出力例
draw_multi_series("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-01-06,横浜店,鉄のフライパン,調理器具,1,7800
2026-02-06,横浜店,白磁のマグカップ,食器,4,7200
") → {"labels":["横浜店","渋谷店"],"line_count":2,"series":{"横浜店":[7800,7200],"渋谷店":[3600,16800]}}
draw_multi_series("売上日,店舗,商品名,カテゴリ,数量,金額
2026-03-01,大宮店,積み重ね収納ボックス,収納,3,4500
2026-03-02,大宮店,布製収納バスケット,収納,2,3000
2026-04-01,大宮店,白磁のマグカップ,食器,4,7200
") → {"labels":["大宮店"],"line_count":1,"series":{"大宮店":[7500,7200]}}