本記事では、Python/matplotlibで実例を使って、積み上げ・100%積み上げ棒グラフを描く方法をご説明します。仕事ですぐに使えるソースコードも紹介します。
Pythonの実行環境
今回は、以下の実行環境でプログラムを実行しています。
・Python 3.7.6
・Jupyterlab 1.2.6
・Pandas:1.1.2
・matplotlib:3.3.2
実例としては、次のような予算管理表を使います。
ファイル名は「テストデータ.xlsx」で、シート名は「予算管理表」です。
■予算管理表
まずは、ライブラリをインポートし、今回扱う予算管理表をdfとして読み込んでおきます。
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
%matplotlib inline
df = pd.read_excel('テストデータ.xlsx', sheet_name = '予算管理表')
※本記事では、Pythonのコードの下のコメントアウトは、出力結果を示しています。
Python / matplotlibで積み上げ縦棒グラフを描く方法
今回は、テストデータの「件名」列で、同一の件名で集約した年度ごとの合計額を、積み上げ縦棒グラフで描いてみたいと思います。
列の値ごとに集約するには、groupby()を使います。
次の記事で解説してるので、そちらを読んでみてください。
参考Pythonで列のフィールド値ごとにグループ集計する方法(groupby)
本記事では、Python/Pandasのgroupby関数で列のフィールド値ごとにグループ集計する方法をご紹介します。 Pythonの実行環境 今回は、以下の実 ...
続きを見る
件名ごとの集約は、次のように書きます。
#年度のリストを定義
year_list = ['2021年度', '2022年度','2023年度']
#件名で集約する
df = df.groupby('件名').sum()[year_list]
集約した結果は、次の通りとなります。
それでは、横軸を年度として、縦軸を件名別に積み上げた棒グラフを作成します。
早速コードは、次のように書きます。
#グラフオブジェクトの定義し、グラフのサイズを設定
fig, ax = plt.subplots(figsize=(10, 6))
#件名別の積み上げ棒グラフの作成
for i in range(len(df)):
ax.bar(df.columns,
df.iloc[i],
bottom=df.iloc[:i].sum(),
width=.5,
alpha=.7)
#グラフのタイトル・列ラベルを設定
ax.set_title('予算の推移(件名別)')
ax.set_xlabel('年度')
ax.set_ylabel('予算額')
#グラフの凡例を設定
ax.legend(df.index.tolist())
積み上げ棒グラフは、棒グラフの作成で使うbar()の引数で、bottomを設定することで描けます。
棒グラフの作り方・bar()の使い方は、次の記事で解説しています。
参考【仕事ですぐ使える】Python / matplotlibで棒グラフを描く方法
本記事では、Python / matplotlibで実例を使って、棒グラフを描く方法をご説明します。仕事ですぐに使えるソースコードも紹介します。 Pythonの ...
続きを見る
積み上げ棒グラフは、「行の数だけforループを回し、回した行の金額をbottomとして増やしていく」といったイメージで作ります。
なので、bottom=df.iloc[:i].sum()が積み上げ棒グラフを作る上で1番のポイントとなります。
結果は、次のようになります。
件名ごとに合計額が積み上がっていることが分かります。
実務としては、年度ごとの合計額の内訳を視覚的に把握したい時に使えます。
Python / matplotlibで100%積み上げ棒グラフを描く方法
次は、年度の件名ごとの割合を表現する「100%積み上げ棒グラフ」を描いてみます。
実は、これはグラフの書き方というより、グラフの元になるデータ(DataFrame)の値を変更すればよいのです。
年度の件名別の金額の割合を算定するため、年度の合計金額で割ればよいことになります。
実際には、forループを使って、次の通り計算を行います。
for year in year_list:
df[year] = df[year] / df[year].sum()
これにより、次の通り件名の金額割合が算定できました。
これを積み上げ棒グラフを同じように書きます。
#グラフオブジェクトの定義し、グラフのサイズを設定
fig, ax = plt.subplots(figsize=(10, 6))
#件名別の積み上げ棒グラフの作成
for i in range(len(df)):
ax.bar(df.columns,
df.iloc[i],
bottom=df.iloc[:i].sum(),
width=.5,
alpha=.7)
#グラフのタイトル・列ラベルを設定
ax.set_title('予算の推移(件名別)')
ax.set_xlabel('年度')
ax.set_ylabel('予算額の割合')
#グラフの凡例を設定
ax.legend(df.index.tolist(), loc='lower right', borderaxespad=2)
グラフの凡例の設定のみ変更しています。
legend()の引数のlocで凡例の位置、borderaxespadで枠との距離を指定しています。
結果は次の通りになります。
100%積み上げ棒グラフなので、年度で同じ高さになり、縦軸がちゃんと割合となっています。
以上、Python / matplotlibで積み上げ棒グラフと100%積み上げ棒グラフを描く方法を実例を題材にして、説明してきました。
最後まで読んでいただき、ありがとうございました。