matplotlib 棒グラフを複数系列並べさせてほしい

matplotlib 棒グラフを複数系列並べさせてほしい

matplotlibで棒グラフを複数系列並べる。

1
2
3
4
Category = ["A", "B", "C", "D", "E"] # カテゴリ名
Value_1 = [9, 2, 4, 8, 7] # 系列 1 のデータ
Value_2 = [6, 1, 6, 6, 4] # 系列 2 のデータ
Value_3 = [5, 1, 7, 4, 1] # 系列 3 のデータ

こんなデータがあったとして、理想はこれ↓

普通にこうすると

1
2
3
4
5
6
from matplotlib import pyplot as plt

plt.bar(Category, Value_1, color='b', width=0.3, label='001', alpha=0.5)
plt.bar(Category, Value_2, color='g', width=0.3, label='002', alpha=0.5)
plt.bar(Category, Value_3, color='r', width=0.3, label='003', alpha=0.5)
plt.legend() # ラベル表示

こうなる↓

???
matplotlib、棒グラフを同じ場所に重ねる。

2系列

2系列なら簡単にできる。

引数のalignでプロット位置が変わる。
align="center"で中心にプロット。
align="edge"で隅にプロット。デフォルトはこれ。

ついでにalpha=0.5で半透明にする。

1
2
3
plt.bar(Category , Value_1, color='b', width=0.3, label='001', alpha=0.5, align="edge")
plt.bar(Category , Value_2, color='g', width=0.3, label='002', alpha=0.5, align="center")
plt.legend() # ラベル表示

alignが2種類しかないのでこの方法だと3系列以上はできない。

3系列以上

めんどくさい。

plt.barの1つ目の引数でプロットするx座標を任意に指定できる。
これを系列ごとに少しだけ(ここでは0.2)ずらすことで重ならないようにしている。

1
2
3
4
5
6
7
8
9
x_1 = [0, 1, 2, 3, 4]            # 系列 1 をプロットするx座標
x_2 = [0.2, 1.2, 2.2, 3.2, 4.2] # 系列 2 をプロットするx座標
x_3 = [0.4, 1.4, 2.4, 3.4, 4.4] # 系列 3 をプロットするx座標

plt.bar(x_1, Value_1, color='b', width=0.3, label='001', alpha=0.5)
plt.bar(x_2, Value_2, color='g', width=0.3, label='002', alpha=0.5)
plt.bar(x_3, Value_3, color='r', width=0.3, label='003', alpha=0.5)
plt.legend() # ラベル表示
plt.xticks(x_2 , Category) # X軸にカテゴリ名表示

参考

matplotlib.pyplot.bar
matplotlib.pyplot.xticks

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×