【すぐに使える】matplotlibでグループ化した棒グラフを簡単に描く関数とクラスを作ってみました。

当ページのリンクには広告が含まれています。

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 を使って、グループ化した棒グラフが簡単に描画できる関数とクラスについて紹介しました。

グラフを描画することに重点を置き、再利用しやすいようソースコードをシンプルにしたかったので、背景色の設定や補助線などのデザイン的な処理は記載していません。

あとは必要に応じて継ぎ足して使っていただければ幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次