Python の matplitlib はかなり強力なグラフ作成パッケージですが、グループ化した棒グラフを作るメソッドがありません。
実現方法としては、普通の棒グラフを少しづつ横にずらして描画することになるのですが、これが結構結構面倒です。
今回は、関数とクラスの2種類を作成してみました。
コピー&ペーストして張り付けていただければ、すぐに使えるようになっていますので、お困りの方は是非お使いください。
matplotlib について詳しく知りたい方は、こちらの記事をご一読下さい。
目次
グループ化した棒グラフの描画サンプル
今回作成した棒グラフは下記の様になります。

グループ化した棒グラフ関数
「グループ化した棒グラフ関数」の仕様は次の通りです。
grouped_bar(X軸のラベル,y軸の値,数値の表示/非表示)
| 引数 | 内容 | 具体例 |
|---|---|---|
| x軸のラベル | X軸のラベルをリスト形式で指定 | [ 'label1' , 'label2' , 'label3' ] |
| y軸の値 | 各棒グラフごとに「ラベル」と「値のリスト」を タプルでまとめ、リストに登録したもの | ( 'chart1' , [4,1,7,6,3] ) |
| 数値の表示/非表示 | Trueで棒の上部に値を表示、Falseで非表示 | True 、False |
具体的なサンプルは次のようになります。
y = []
y.append(('chart1',[4,1,7,6,3]))
y.append(('chart2',[5,5,2,8,1]))
y.append(('chart3',[3,4,8,4,3]))
y.append(('chart4',[2,5,6,2,8]))
y.append(('chart5',[7,3,3,3,2]))
xlabel = ['label1', 'label2', 'label3', 'label4',' label5']
grouped_bar(xlabel,y,True)
下記が実際の関数のソースコードです。
そのままコピー&ペーストして、適当にカスタマイズしてお使いください。
import matplotlib.pyplot as plt
def grouped_bar(xlabel,y,isvalue=False,groupwidth=0.8,barwidth=0.9,location='best'):
'''
グループ化した棒グラフの描画
Parameters
----------------------------
isvalue:bool
グラフ上部への値の表示/非表示
groupwidth:float
1つのグループの幅 を 0~1で指定。
barwidth:float
グループ内の棒グラフ1つ当たりの幅を0~1で指定。
location:int,str
凡例の表示場所
'''
x = [i + 1 for i in range(len(xlabel))]
barcnt = len(y)
size = groupwidth / barcnt
xx = groupwidth/ 2
# 棒グラフの描画
for i in range(barcnt):
pos = [size / 2 + x[n] - xx + size * i for n in range(len(x))]
rect = plt.bar(pos, y[i][1], width=size * barwidth, label=y[i][0], align="center")
# グラフに値を表示
if isvalue == True:
for tx, ty in zip(pos, y[i][1]):
plt.text(tx, ty, ty, ha='center', va='bottom')
# 凡例
plt.legend (loc=location)
# X軸のラベルを表示
plt.xticks(x, xlabel)
plt.show()
グループ化した棒グラフクラス
「クループ化した棒グラフクラス」は、専用のメソッドを使ってX軸のラベルとY軸の値を登録し、最後に showメソッドを呼ぶことで描画されます。

| 機能 | メソッド名 | 引数 |
|---|---|---|
| コンストラクタ | GroupedBar ( isvalue=False, groupwith=0.8, barwidth=0.9, location='best' ) | 値を棒の上に表示, 棒グラフグループの幅, 棒グラフの幅, l凡例の表示位置 |
| X軸ラベルの登録 | set_xlabel(xlabel) | Xラベルのリスト |
| Y軸ラベルと データの登録 | add_bar(ylabel,values) | Y軸のラベルのリスト, Y軸の値のリスト |
| グラフの表示 | show() |
具体的な使用方法は次の通りです。
gb=GroupedBar()
gb.add_bar('chart1',[4,1,7,6,3])
gb.add_bar('chart2',[5,5,2,8,1])
gb.add_bar('chart3',[3,4,8,4,3])
#gb.add_bar('chart4',[2,5,6,2,8])
#gb.add_bar('chart5',[7,3,3,3,2])
gb.set_xlabel(['label1', 'label2', 'label3', 'label4',' label5'])
gb.show()
下記が実際のクラスのソースコードです。
そのままコピー&ペーストして、適当にカスタマイズしてお使いください。
import matplotlib.pyplot as plt
class GroupedBar:
'''
グループ化した棒グラフを描画するためのヘルパークラス
'''
def __init__(self,isvalue=False,groupwidth=0.8,barwidth=0.9,location='best'):
'''
コンストラクタ
Parameters
----------------------------
isvalue:bool
グラフ上部への値の表示/非表示
groupwidth:float
1つのグループの幅 を 0~1で指定。
barwidth:float
グループ内の棒グラフ1つ当たりの幅を0~1で指定。
location:int,str
凡例の表示場所
'''
self.groupwidth = groupwidth
self.barwidth = barwidth
self.location = location
self.isvalue = isvalue
self.values = []
self.xlabel = []
self.groupwidth=0.8
self.barwidth = 0.9
self.location='best'
self.isvalue=False
def set_xlabel(self,xlabel):
'''
X軸ラベルの登録
Parameters
----------------------------
xlabel:[str]
X軸のラベルをリストで指定
'''
self.xlabel = xlabel
def add_bar(self,ylabel,values):
'''
棒グラフの登録
Parameters
----------------------------
ylabel:str
棒グラフのラベル
values:[int,float]]
y軸の値をリストで指定
'''
self.values.append((ylabel,values))
def show(self):
'''
棒グラフの描画
'''
x = [i + 1 for i in range(len(self.xlabel))]
barcnt = len(self.values)
size = self.groupwidth / barcnt
xx = self.groupwidth/ 2
# 棒グラフの描画
for i in range(barcnt):
pos = [size / 2 + x[n] - xx + size * i for n in range(len(x))]
rect = plt.bar(pos, self.values[i][1], width=size * self.barwidth,
label=self.values[i][0], align="center")
# グラフに値を表示
if self.isvalue == True:
for tx, ty in zip(pos, self.values[i][1]):
plt.text(tx, ty, ty, ha='center', va='bottom')
# 凡例
plt.legend (loc=self.location)
# X軸のラベルを表示
plt.xticks(x, self.xlabel)
plt.show()
まとめ
今回はPython の matplotlib を使って、グループ化した棒グラフが簡単に描画できる関数とクラスについて紹介しました。
グラフを描画することに重点を置き、再利用しやすいようソースコードをシンプルにしたかったので、背景色の設定や補助線などのデザイン的な処理は記載していません。
あとは必要に応じて継ぎ足して使っていただければ幸いです。
コメント