棒グラフはとても一般的なデータ可視化の方法で,よく用いられています
Matplotlibでは棒グラフを数行のコードで簡単に表示することができます.
本記事では,一般的な棒グラフ,積み上げ式棒グラフ,グループ化された棒グラフ,水平方向の棒グラフの表示方法について解説しています
また,棒グラフのラベルのつけ方やエラーバーの設定,色のカスタマイズについても詳しく説明しました
一般的な棒グラフ (Axes.bar)
Matplotlibで棒グラフを表示するには,Axes.bar関数を用います
棒グラフのyの高さだけで描画できます
- 引数
-
- 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関数と同じ使い方をします
- 引数
-
- 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関数を用います
- 引数
-
- container (BarContainer):Axes.barかAxes.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関数
積み上げ式棒グラフ
グループ化された棒グラフ
水平方向の棒グラフ
棒グラフのラベル
コメント