Matplotlib でのスタックバープロット

Suraj Joshi 2023年1月30日
  1. 棒グラフの積み重ね Matplotlib
  2. Pandas を使用したスタックバーのプロット
Matplotlib でのスタックバープロット

Matplotlib では、matplotlib.pyplot.bar() メソッドを用いて棒グラフを生成します。あるデータセットの棒グラフを別のデータセットに重ねるために、重ねる必要のあるすべてのデータセットを追加し、その合計を bar() メソッドに bottom パラメータとして渡します。

import matplotlib.pyplot as plt

data1 = [30, 20, 10, 0, 0]
data2 = [20, 20, 20, 20, 0]
data3 = [50, 60, 70, 80, 100]

year = ["2015", "2016", "2017", "2018", "2019"]

fig, ax = plt.subplots(3, 1, figsize=(10, 8))

ax[0].bar(year, data1, color="red")
ax[0].legend(["C++"])
ax[1].bar(year, data2, color="yellow")
ax[1].legend(["JavaScript"])
ax[2].bar(year, data3, color="green")
ax[2].legend(["Python"])

plt.show()

出力:

スタックされた棒グラフの説明例 Matplotlib

ここでは、ある企業の従業員の 5 年間のプログラミング言語の選好度を表す 3つの別々の棒グラフを用意しています。ある言語の棒グラフを他の言語よりも積み重ねる方法を検討し、1つの棒グラフで長年のプログラミング言語の全体的な選好度を調べていきます。

棒グラフの積み重ね Matplotlib

import numpy as np
import matplotlib.pyplot as plt

data1 = [30, 20, 10, 0, 0]
data2 = [20, 20, 20, 20, 0]
data3 = [50, 60, 70, 80, 100]

year = ["2015", "2016", "2017", "2018", "2019"]

plt.figure(figsize=(9, 7))
plt.bar(year, data3, color="green", label="Python")
plt.bar(year, data2, color="yellow", bottom=np.array(data3), label="JavaScript")
plt.bar(year, data1, color="red", bottom=np.array(data3) + np.array(data2), label="C++")

plt.legend(loc="lower left", bbox_to_anchor=(0.8, 1.0))
plt.show()

出力:

Matplotlib でのスタックバープロット

1つのバーのプロットを別のバーの上に重ねていきます。プロットでは、まず data3 を Python データとしてプロットし、これを他の棒グラフのベースとします。data2 の棒グラフを data3 の棒グラフに重ねるには、bottom=np.array(data3) とします。

同様に、data1 の棒グラフをプロットする際には、data2data3 の棒グラフをベースにします。そのためには、data1 の棒グラフをプロットするときに bottom=np.array(data3)+np.array(data2) とします。

注意すべき点は、bottom パラメータにデータを追加するには NumPy の配列を使わなければならないということです。bottom=data3+data2 とすると、data3 のリストの末尾に data2 の要素を追加してリストを作成することになります。

NumPy 配列を利用したくない場合は、リスト内包を利用してリストの対応する要素を追加することができます。

import numpy as np
import matplotlib.pyplot as plt

data1 = [30, 20, 10, 0, 0]
data2 = [20, 20, 20, 20, 0]
data3 = [50, 60, 70, 80, 100]

year = ["2015", "2016", "2017", "2018", "2019"]

plt.figure(figsize=(9, 7))
plt.bar(year, data3, color="green", label="Python")
plt.bar(year, data2, color="yellow", bottom=data3, label="JavaScript")
plt.bar(
    year,
    data1,
    color="red",
    bottom=[sum(data) for data in zip(data2, data3)],
    label="C++",
)

plt.legend(loc="lower left", bbox_to_anchor=(0.8, 1.0))
plt.show()

出力:

リスト内包を用いた Matplotlib のスタックバープロット

Pandas を使用したスタックバーのプロット

Python の Pandas ライブラリを使って、Python でスタック棒グラフを生成することもできます。

import pandas as pd
import matplotlib.pyplot as plt

years = ["2015", "2016", "2017", "2018", "2019"]
data = {
    "Python": [50, 60, 70, 80, 100],
    "JavaScript": [20, 20, 20, 20, 0],
    "C++": [30, 20, 10, 0, 0],
}

df = pd.DataFrame(data, index=years)

df.plot(kind="bar", stacked=True, figsize=(10, 8))
plt.legend(loc="lower left", bbox_to_anchor=(0.8, 1.0))
plt.show()

出力:

Pandas を使った Matplotlib でのスタック棒グラフ

これは、Pandas DataFrame から、DataFrame 内の各インデックスに対して、ある列の棒グラフが別の列に重ねられている積層棒グラフを生成します。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

関連記事 - Matplotlib Visualizations