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()
出力:
ここでは、ある企業の従業員の 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()
出力:
1つのバーのプロットを別のバーの上に重ねていきます。プロットでは、まず data3
を Python データとしてプロットし、これを他の棒グラフのベースとします。data2
の棒グラフを data3
の棒グラフに重ねるには、bottom=np.array(data3)
とします。
同様に、data1
の棒グラフをプロットする際には、data2
と data3
の棒グラフをベースにします。そのためには、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()
出力:
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 DataFrame から、DataFrame 内の各インデックスに対して、ある列の棒グラフが別の列に重ねられている積層棒グラフを生成します。
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn