Python × グラフ

Python/matplotlibで積み上げ・100%積み上げ棒グラフを描く方法

2020-10-26

本記事では、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の実行環境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-bar-chart
参考【仕事ですぐ使える】Python / matplotlibで棒グラフを描く方法

本記事では、Python / matplotlibで実例を使って、棒グラフを描く方法をご説明します。仕事ですぐに使えるソースコードも紹介します。 目次 Pyth ...

続きを見る

 

積み上げ棒グラフは、「行の数だけ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%積み上げ棒グラフ

 

100%積み上げ棒グラフなので、年度で同じ高さになり、縦軸がちゃんと割合となっています。

 

 

以上、Python / matplotlibで積み上げ棒グラフと100%積み上げ棒グラフを描く方法を実例を題材にして、説明してきました。

最後まで読んでいただき、ありがとうございました。

よく読まれている記事

se-shikaku 1

  社内SEになるには資格って必要?社内SEでキャリアップするときにおすすめの資格は? 回答としては、 社内SEは、対人スキル、実務での対応力や最新情 ...

社内SEの仕事内容 2

  社内SEってどんな仕事なんだろ~ 検索しても転職サイトの記事ばかりでよく分からない・・   確かにそうですね。。実経験を基に、社内SE( ...

side-work-trial 3

  コロナで会社の経営も不安。。個人でお金稼ぎたいな~ 今、こう考えるサラリーマン、OLの方はごまんといると思います。   僕は、本業では社 ...

adsense-pass 4

【3記事で一発合格】Google AdSense申請に合格したブログ情報 こんにちは、いなサラ(@いなサラ|田舎の情シスサラリーマン)です。 2019年10月5 ...

-Python × グラフ

© 2020 inasala note