【Matplotlib】棒グラフとカスタム方法の徹底解説 (bar, barh, bar_label)

棒グラフはとても一般的なデータ可視化の方法で,よく用いられています

Matplotlibでは棒グラフを数行のコードで簡単に表示することができます.

本記事では,一般的な棒グラフ,積み上げ式棒グラフ,グループ化された棒グラフ,水平方向の棒グラフの表示方法について解説しています

また,棒グラフのラベルのつけ方やエラーバーの設定,色のカスタマイズについても詳しく説明しました

目次

一般的な棒グラフ (Axes.bar)

Matplotlibで棒グラフを表示するには,Axes.bar関数を用います

棒グラフのyの高さだけで描画できます

Axes.bar
引数
  • x (float or 配列):棒のx座標
  • height (float or 配列):棒の高さ
  • width (float or 配列):棒の幅
  • bottom (float or 配列):棒のy座標の始点
  • align (文字列):x座標にどう配置するか.centerかedge
  • xerr, yerr (float or 配列):エラーバー.数値に合わせて+/-のサイズで作成
  • color (color or color配列):棒の色
  • edgecolor (color or color配列):棒の枠の色
  • linewidth (float):枠の線の太さ
  • ecolor (color or color配列):エラーバーの色
  • capsize (float):エラーバーの傘部分のサイズ
  • log (bool):TrueかFalseで対数スケール
  • **kwargs:ほかにも様々な引数がありますので,公式ドキュメントを参考にしてください
返値
公式ドキュメント

下記のタブにコードとフローチャートの解説をしています

import matplotlib.pyplot as plt
import numpy as np

    
# step1 データの作成
labels = ['G1', 'G2', 'G3', 'G4', 'G5']
x = np.arange(len(labels))
men_means = [20, 34, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]

# step2 グラフフレームの作成
fig, ax = plt.subplots()
# step3 棒グラフの描画
ax.bar(x, men_means, label='Men', tick_label=labels)

ax.set_xlabel('X label')
ax.set_ylabel('Y label')
ax.set_title('Basic Bar')
ax.legend()

plt.show()

水平方向の棒グラフ (Axes.barh)

Matplotlibで水平方向の棒グラフを表示するには,Axes.barh関数を用います

基本的に垂直方向の棒グラフを書くAxes.bar関数と同じ使い方をします

Axes.barh
引数
  • y (float or 配列):棒のy座標
  • width (float or 配列):棒の水平方向の長さ
  • height (float or 配列):棒の幅
  • left (float or 配列):棒のx座標の始点
  • align (文字列):x座標にどう配置するか.centerかedge
  • xerr, yerr (float or 配列):エラーバー.数値に合わせて+/-のサイズで作成
  • color (color or color配列):棒の色
  • edgecolor (color or color配列):棒の枠の色
  • linewidth (float):枠の線の太さ
  • ecolor (color or color配列):エラーバーの色
  • capsize (float):エラーバーの傘部分のサイズ
  • log (bool):TrueかFalseで対数スケール
  • **kwargs:ほかにも様々な引数がありますので,公式ドキュメントを参考にしてください
返値
公式ドキュメント
# step3 水平棒グラフの描画
ax.barh(y, women_means, label='Women', tick_label=labels)

plt.show()

y軸ラベルを昇順にする (Axes.invert_yaxis)

水平方向の棒グラフのy軸は,(0, 0)の座標から上に行くほど数値が大きくなります

ただ,文字列ラベルで表示する場合は逆にしたいので,Axes.invert_yaxisを使って,y軸ラベルを昇順にします

# step3 水平棒グラフの描画
ax.barh(y, women_means, label='Women', tick_label=labels)
# y軸を逆にする
ax.invert_yaxis()
plt.show()

右から左に棒グラフを伸ばす (Axes.invert_xaxis)

水平方向の棒グラフのy軸は,x=0の座標から棒が伸びます

Axes.invert_xaxisを使うと,x=0が右側になり,右から左に棒グラフが伸びます

# step3 水平棒グラフの描画
ax.barh(y, women_means, label='Women', tick_label=labels)
# x軸を逆にする
ax.invert_xaxis()
plt.show()

積み上げ式棒グラフ (bottom or left)

棒グラフを積み上げて表示する場合にも,Axes.bar関数Axes.barh関数を用います

積み上げるにはbottomを指定して,2番目のデータの始点を変更します

Axes.barh関数の水平棒グラフでは,leftを指定します

# step3 棒グラフの描画
ax.bar(x, men_means, label='Men')
ax.bar(x, women_means, label='Women', bottom=men_means, tick_label=labels)

plt.show()

グループ化された棒グラフ (width or height)

棒グラフをグループ化して表示する場合にも,Axes.bar関数Axes.barh関数を用います

各要素をずらして表示するには,widthで幅を指定するだけで実現可能です

棒グラフの幅を0.4にして,x座標を0.2ずつずらしています

Axes.barh関数の水平棒グラフでは,heightで幅を指定します

width = 0.4

# step3 棒グラフの描画
ax.bar(x - width/2, men_means, width, label='Men', tick_label=labels)
ax.bar(x + width/2, women_means, width, label='Women', tick_label=labels)

plt.show()

ラベル付き棒グラフ (Axes.bar_label)

棒グラフの各要素ごとにラベルを表示するには,Axes.bar_label関数を用います

Axes.bar_label (containerlabels, fmtlabel_typepadding**kwargs)
引数
  • container (BarContainer):Axes.barAxes.barhで作成した変数を指定
  • labels (配列):ラベルテキストを配列で指定することで,ラベルが表示.指定しなかった場合は,fmtで指定したスタイルのデータ値が表示
  • fmt (文字列):フォーマット文字列で,データ値の表示スタイル
  • label_type (文字列):edge(上端)かcenter(中央)のラベル位置
  • padding (float):棒グラフの上端からの距離
  • **kwargs:ほかにも様々な引数がありますので,公式ドキュメントを参考にしてください
返値

Textのリスト

公式ドキュメント

matplotlib.axes.Axes.bar_label — Matplotlib 3.6.0 documentation

ラベル付きの一般的な棒グラフ

一般的な棒グラフでご紹介したようなデータが1つの棒グラフにラベルを付けます

手順はAxes.bar関数でbarcontainerの変数を作成し,その変数にラベルの配列を定義します.

# step3 棒グラフの描画
# barcontainerの変数を作成
basic = ax.bar(x, men_means, width=0.4, label='Men', tick_label=labels)

# step4 棒グラフのラベル表示
# ラベルの配列を定義
ax.bar_label(basic, labels=men_means)

plt.show()

ラベル付き積み上げ式棒グラフ (fmt)

複数のデータを縦に並べる積み上げ式棒グラフにラベルを付けます

Axes.bar関数で作成したそれぞれの変数は,異なる変数名にしてください

また,fmtで小数点1位で表示されるようにしました

width = 0.4

# step3 棒グラフの描画
stock1 = ax.bar(labels, men_means, width, label='Men', tick_label=labels)
stock2 = ax.bar(labels, women_means, width, bottom=men_means, label='Women', tick_label=labels)

# step4 棒グラフのラベル表示
ax.bar_label(stock1, fmt='%.1f')
ax.bar_label(stock2, fmt='%.1f')

plt.show()

ラベル付きグループ化棒グラフ (padding)

複数のデータを横に並べるグループ化棒グラフにラベルを付けます

Axes.bar関数で作成したそれぞれの変数は,異なる変数名にしてください

また,Womenのラベルはpaddingを指定して間隔を変更しました

width = 0.4

# step3 棒グラフの描画
group1 = ax.bar(x - width/2, men_means, width, label='Men', tick_label=labels)
group2 = ax.bar(x + width/2, women_means, width, label='Women', tick_label=labels)

# step4 棒グラフのラベル表示
ax.bar_label(group1, labels=men_means)
ax.bar_label(group2, labels=women_means, padding=10)

plt.show()

ラベル付き水平棒グラフ (fontsize)

水平方向の棒グラフにラベルを付けます

fontsizeを15として,少し目立つようにしました
他はfontsize=12になってます

# step3 水平棒グラフの描画
graph = ax.barh(y, women_means, height=0.6, label='Women')

# step4 水平棒グラフのラベル表示
ax.bar_label(graph, labels=women_means, padding=5, fontsize=14)

plt.show()

棒グラフのエラーバー (xerr, yerr)

棒グラフの誤差棒はxerrかyerrに数値の配列を指定します

xerrとyerrはx方向かy方向かの違いで,同時に指定することも可能です

y方向のエラーバー (yerr)

基本的な棒グラフは,yerrでy方向のエラーバーです

# エラーバーの配列
men_std = [2, 3, 4, 1, 2]
# step3 棒グラフの描画
ax.bar(x, men_means, width=0.4, label='Men', yerr=men_std, tick_label=labels)

plt.show()

棒グラフのエラーバーに誤差ラベルを付ける (xerr)

水平棒グラフのエラーバーに誤差の大きさを表すラベルを付けます

水平棒グラフでは,xerrでx方向のエラーバーとします

# エラーバーの配列
women_std = [3, 5, 2, 3, 3]
# step3 水平棒グラフの描画
graph = ax.barh(y, women_means, height=0.6, label='Women', xerr=women_std)
# step3 水平棒グラフのラベル表示
ax.bar_label(graph, labels=['±%.1f' % e for e in women_std], padding=5, fontsize=14)

plt.show()

エラーバーの色を変える (ecolor)

エラーバーの色はAxes.bar関数の引数にecolorを使用します

色の指定方法は下記を参照してください

# エラーバーのデータ
men_std = [2, 3, 4, 1, 2]

ax.bar(x, men_means, width=0.4, yerr=men_std, ecolor='red', tick_label=labels)

plt.show()

エラーバーのサイズを変える (capsize)

エラーバーのサイズはAxes.bar関数の引数にcapsizeを使用します

# エラーバーのデータ
men_std = [2, 3, 4, 1, 2]

ax.bar(x, men_means, width=0.4, yerr=men_std, capsize=10, tick_label=labels)

plt.show()

棒グラフのその他のカスタマイズ

Axes.bar関数は他にもいろんな引数があり,カスタマイズ可能です

棒グラフの色は棒の表面の色のcolorと枠の色のedgecolorの2つで指定できます

また,edgecolorとlinewidthを組み合わせることで棒グラフの枠の太さを調整します

棒のメインの色を変更する (color)

棒の表面の色はAxes.bar関数の引数にcolorを指定します

今回は棒ごとに,C0, C1, C2という文字列を指定しました

# step3 棒グラフの描画
ax.bar(x, men_means, tick_label=labels, color=['C'+str(i) for i in range(len(men_means))])

plt.show()

棒の枠の色を変更する (edgecolor, linewidth)

棒の枠の色はAxes.bar関数の引数にedgecolorを指定します

今回は棒ごとに,C0, C1, C2という文字列を指定しました

また,linewidthで枠の太さを数値で調整していますが,配列で指定することもできます

# step3 棒グラフの描画
ax.bar(x, men_means, tick_label=labels, color='white', edgecolor=['C'+str(i) for i in range(len(men_means))], linewidth=5)

plt.show()

棒のx座標の起点を変更する (align)

棒グラフは指定したx座標の中心から描画されます

Axes.bar関数の引数にalignをedgeとするとx座標は棒の左端に変更されます

# step3 棒グラフの描画
ax.bar(x, men_means, align='edge', label='Men')

plt.show()

対数スケールの棒グラフ (log)

このセクションでは,軸のスケールを対数に変更します

Axes.bar関数の引数でlog=Trueとすれば対数軸になります

# step3 棒グラフの描画
ax.bar(x, men_means, tick_label=labels, log=True)

plt.show()

参考文献

Axes.bar関数

Axes.barh関数

Axes.bar_label関数

積み上げ式棒グラフ

グループ化された棒グラフ

水平方向の棒グラフ

棒グラフのラベル

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次