1.モジュールの準備
Pythonで積み上げ棒グラフを描く際の備忘録です。
まずは必要なモジュールをインポートします。
個人的にはラベル等は英語でいい気がしていますが、業務上レポートを書く際には日本語での記載する必要も多々あると思います。
japanize_matplotlib
は、インポートするだけで簡単にタイトルや軸ラベルを日本語表示にすることができます。
import matplotlib.pyplot as plt
import japanize_matplotlib
適当なデータセットを横持ちで作ります。縦持ちデータの場合は、pivot_table
などを使うと簡単に横持ちにすることができます。
今回はどこかしらの施設の1~3月の入場者数を積み上げ棒グラフで表してみたいと思います。
dataset = pd.DataFrame([[200, 350, 500], [150, 100, 250], [100, 400, 230]],
columns=['1月', '2月', '3月'],
index=['male', 'female', 'Other'])
1月 | 2月 | 3月 | |
---|---|---|---|
male | 200 | 350 | 500 |
female | 150 | 100 | 250 |
other | 100 | 400 | 230 |
2.関数定義
データの準備ができたら、可視化用の関数を定義します
グラフ作成の際には、大体グラフの高さ、横幅、データラベルのサイズをデータに応じて変更したくなるため、変数として放り込めるようにしたいと思います。
ただ、グラフサイズやラベルサイズを変更しても、凡例の文字は大きくならないため、plt.rcParams.update(params)
を用いることで、凡例の文字サイズ、凡例ハンドル?サイズを変更しています。
def make_stack_bar(data, width, height, font, ylim, title, xlabel, ylabel):
fig, ax = plt.subplots(figsize=(width, height))
ax.grid(True)
for i in range(len(data)):
ax.bar(data.columns,
data.iloc[i],
bottom=data.iloc[:i].sum()
)
for j in range(len(data.columns)):
plt.text(x=j,
y=data.iloc[:i, j].sum()+(data.iloc[i, j]/2),
s=data.iloc[i, j],
ha='center',
va='bottom',
fontsize=font
)
ax.set_ylim([0,ylim])
ax.legend(data.index)
ax.set_title(title, size=24)
ax.set_xlabel(xlabel, size=16)
ax.set_ylabel(ylabel, size=16)
ax.tick_params(axis='x', labelsize= 16)
ax.tick_params(axis='y', labelsize= 14)
params = {'legend.fontsize': 16,
'legend.handlelength': 2}
plt.rcParams.update(params)
plt.show()
3.可視化
関数が定義できたら、さっそく可視化します。
make_stack_bar(dataset, 8, 8, 12, 1200, "各月の性別来場者数", "月", "人数")
これで下記のようなグラフができました。
簡単なグラフならばこれで内訳がよくわかりますね。