Python
 Computer >> コンピューター >  >> プログラミング >> Python

Matplotlibで複数ラベル付きの棒グラフを描画する方法を徹底解説

Matplotlibを使って、グループごとに複数のラベルを持つ棒グラフを作成する方法を紹介します。この記事では、男性と女性の平均スコアを比較するグループ化された棒グラフを例に、各バーに数値ラベルを自動表示する手法まで詳しく解説します。

実装の手順

  • men_means、men_std、women_means、women_std のデータセットを用意します。
  • NumPyを使って、グループのX軸上の位置(インデックス)を作成します。
  • 棒の幅(width)を初期化します。
  • subplots() メソッドで図(figure)とサブプロット(axes)を作成します。
  • bar() メソッドを使って、rects1rects2 の2つの棒グラフを作成します。
  • set_ylabel()set_title()set_xticks()set_xticklabels() メソッドで軸ラベルやタイトルを設定します。
  • legend() で凡例をグラフ上に配置します。
  • autolabel() 関数を定義し、各バーに数値ラベルを自動的に追加します。
  • show() メソッドで図を表示します。

サンプルコード

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

men_means, men_std = (20, 35, 30, 35, 27), (2, 3, 4, 1, 2)
women_means, women_std = (25, 32, 34, 20, 25), (3, 5, 2, 3, 3)

ind = np.arange(len(men_means)) # グループのX軸位置
width = 0.35 # 棒の幅

fig, ax = plt.subplots()
rects1 = ax.bar(ind - width/2, men_means, width, yerr=men_std, label='Men')
rects2 = ax.bar(ind + width/2, women_means, width, yerr=women_std, label='Women')

ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind)
ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5'))
ax.legend()

def autolabel(rects, xpos='center'):
    ha = {'center': 'center', 'right': 'left', 'left': 'right'}
    offset = {'center': 0, 'right': 1, 'left': -1}
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
            xy=(rect.get_x() + rect.get_width() / 2, height),
            xytext=(offset[xpos]*3, 3), # 3ポイントのオフセットを使用
            textcoords="offset points", # 両方向に適用
            ha=ha[xpos], va='bottom')

autolabel(rects1, "left")
autolabel(rects2, "right")
plt.show()

コードのポイント解説

グループ化された棒グラフの配置

2つのデータ系列を並べて表示するために、一方のバーは ind - width/2、もう一方は ind + width/2 の位置に配置しています。これにより、同じグループ内の2本のバーが隣接して表示されます。

エラーバー(yerr)の活用

yerr 引数に標準偏差を渡すことで、各バーに誤差範囲を示すエラーバーが自動的に描画され、データのばらつきを視覚的に表現できます。

autolabel関数によるラベル表示

autolabel() 関数は、各バーの高さ(get_height())を取得し、ax.annotate() を使ってその値をバーの上部に表示します。引数 xpos でラベルの水平位置(center / left / right)を切り替えられるため、隣接するバー同士でラベルが重なるのを防げます。この例では、男性のバーには「left」、女性のバーには「right」を指定しています。

出力結果

このコードを実行すると、G1〜G5の5つのグループごとに男性と女性のスコアを比較できる棒グラフが表示され、各バーの上部にはその値がラベルとして自動的に付与されます。エラーバーによってデータの標準偏差も一目で確認できます。

  1. Matplotlibで複数のX軸・Y軸をプロットする方法(twinx / twinyの使い方)

    データ分析や可視化では、スケールの異なる2つのデータ系列を同じグラフ上に重ねて表示したいケースがよくあります。Matplotlibでは、twinx() メソッドや twiny() メソッドを使うことで、X軸またはY軸を共有しながら独立したもう一方の軸を持つグラフを簡単に作成できます。 この記事では、左右に異なるY軸を持つグラフを作成する手順を、具体的なコード例とともに解説します。 複数のY軸を持つグラフの作成手順 以下の手順で、左と右に別々のY軸スケールを持つプロットを作成できます。 subplots() メソッドを使用して、図(figure)とサブプロット(axes)を作成します。 最初の

  2. Matplotlibでカラーバー付き2D行列をPythonでプロットする方法

    Pythonでカラーバー付きの2D行列をプロットするには、numpyを使って2次元配列(行列)を作成し、そのデータをimshow()メソッドに渡すのが最も簡単な方法です。手順numpyを使用して data2D という2次元配列を作成します。imshow() メソッドを使い、データを画像として(2次元の正規ラスタ上に)表示します。colorbar() メソッドに imshow() が返す ScalarMappable インスタンスを渡し、カラーバーを作成します。これにより、色と数値の対応関係がひと目でわかるようになります。図を表示するには、show() メソッドを使用します。コード例import