棒グラフ
このレッスンでできるようになること。店舗別の売上を棒グラフで描き、棒の高さをコードで読み返せるようになります。
棒グラフは比較のための図です。並んだ棒の長さを目で比べるのは人間が得意なことなので、「どこがいちばん大きいか」を伝えるならまず棒を選びます。逆に、時間の流れを見せたいときは棒より折れ線が向いています。図の種類は好みではなく目的で決めます。
Python
by_store = df.groupby("店舗")["金額"].sum()
fig, ax = plt.subplots()
ax.bar(by_store.index, by_store.values)描く前に集計しておくのが基本の流れです。matplotlib は与えられた値をそのまま棒にするだけで、集計はしてくれません。第4章で作った groupby の結果が、そのまま棒グラフの入力になります。集計してから描く、この順番を体に入れてください。
棒グラフには並び順という設計判断があります。groupby の結果は店舗名の昇順なので、店舗名の文字の順に棒が並びます。これは比較には向きません。売上の大きい順に並べ替えると、順位が形として伝わります。
Python
by_store = by_store.sort_values(ascending=False)ただし、月のように本来の順序があるものを大きさで並べ替えてはいけません。並べ替えてよいのは、順序に意味が無い分類だけです。
描いた棒は ax.patches で取り出せます。patch は棒1本を表す長方形で、get_height() でその高さ、つまり描かれた値が読めます。
Python
heights = [int(p.get_height()) for p in ax.patches]この読み返しで、集計から描画までの間に取り違えが無かったかを確認できます。棒の順番は描いた順に並ぶので、並べ替えた結果が本当に反映されているかもここで分かります。横軸のラベルは ax.get_xticklabels() から取れますが、まずは高さの読み返しを確実にできるようにしましょう。
図に「売上が最大の店舗はどこか」という結論を入れるときは、集計結果の idxmax() が使えます。max() が最大の金額を返すのに対し、idxmax() はその金額に対応する行のラベルを返します。月別の Series なら月、店舗別なら店舗名、カテゴリ別ならカテゴリ名が返ります。
Python
by_store = pd.Series([7800, 20400], index=["横浜店", "渋谷店"])
print(int(by_store.max())) # 20400
print(by_store.idxmax()) # 渋谷店同じ最大値が複数あるときは、先に並んでいるラベルを返します。次の折れ線グラフでも、売上が最大の月を求めるときに使います。
要件
- groupby で店舗別の売上合計を求める
- 売上の大きい順に並べ替えてから描く
- ax.bar で棒グラフを描く
- heights は ax.patches から get_height() で読み返す
- matplotlib.use("Agg") を pyplot の import より前に書く