Skip to content

Matplotlib 棒グラフ:plt.bar() と plt.barh() 完全ガイド

Updated on

棒グラフはカテゴリ間の数量を比較する最も一般的な方法です。四半期ごとの売上、学生ごとのスコア、ステータスごとのカウント -- 棒グラフはこれらの比較を即座に読み取れるようにします。しかし、Matplotlibで効果的な棒グラフを作成するには、単純な plt.bar() の呼び出しだけでは不十分です。グループ化された比較、積み上げ構成、長いラベル用の水平レイアウト、そしてグラフを自明にする適切なアノテーションを処理する必要があります。

このガイドでは、基本的な垂直バーから高度なグループ化および積み上げ構成まで、Matplotlibで必要なすべての棒グラフパターンをカバーします。

📚

基本的な垂直棒グラフ

import matplotlib.pyplot as plt
 
categories = ['Python', 'JavaScript', 'Java', 'C++', 'Go']
values = [35, 28, 22, 15, 12]
 
plt.figure(figsize=(8, 5))
plt.bar(categories, values, color='steelblue', edgecolor='black', linewidth=0.5)
plt.xlabel('言語')
plt.ylabel('人気スコア')
plt.title('プログラミング言語の人気度')
plt.show()

plt.barh() による水平棒グラフ

カテゴリラベルが長い場合やカテゴリが多い場合は水平バーを使用します:

import matplotlib.pyplot as plt
 
frameworks = ['React', 'Vue.js', 'Angular', 'Svelte', 'Next.js',
              'Django', 'Flask', 'FastAPI', 'Express', 'Rails']
stars = [220, 207, 95, 78, 124, 78, 67, 74, 64, 55]
 
plt.figure(figsize=(10, 6))
plt.barh(frameworks, stars, color='#3498db', edgecolor='white')
plt.xlabel('GitHub スター数(千)')
plt.title('GitHub スター数によるフレームワーク人気度')
plt.gca().invert_yaxis()  # 最大を上に
plt.tight_layout()
plt.show()

色のカスタマイズ

import matplotlib.pyplot as plt
 
categories = ['Q1', 'Q2', 'Q3', 'Q4']
revenue = [120, 150, 180, 200]
 
# バーごとに異なる色
colors = ['#e74c3c', '#f39c12', '#2ecc71', '#3498db']
 
plt.figure(figsize=(8, 5))
bars = plt.bar(categories, revenue, color=colors, edgecolor='black', linewidth=0.5)
plt.ylabel('売上($K)')
plt.title('四半期売上')
plt.show()

バーに値ラベルを追加

import matplotlib.pyplot as plt
 
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
 
plt.figure(figsize=(8, 5))
bars = plt.bar(categories, values, color='steelblue')
 
# 各バーの上に値ラベルを追加
for bar, val in zip(bars, values):
    plt.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 1,
             str(val), ha='center', va='bottom', fontsize=11)
 
plt.ylabel('値')
plt.title('値ラベル付き棒グラフ')
plt.show()

グループ化棒グラフ

複数の系列を横に並べて比較:

import matplotlib.pyplot as plt
import numpy as np
 
categories = ['Q1', 'Q2', 'Q3', 'Q4']
product_a = [20, 35, 30, 35]
product_b = [25, 32, 34, 20]
product_c = [15, 20, 25, 30]
 
x = np.arange(len(categories))
width = 0.25
 
plt.figure(figsize=(10, 6))
plt.bar(x - width, product_a, width, label='製品 A', color='#e74c3c')
plt.bar(x, product_b, width, label='製品 B', color='#3498db')
plt.bar(x + width, product_c, width, label='製品 C', color='#2ecc71')
 
plt.xlabel('四半期')
plt.ylabel('売上($K)')
plt.title('製品別四半期売上')
plt.xticks(x, categories)
plt.legend()
plt.tight_layout()
plt.show()

積み上げ棒グラフ

各カテゴリの構成を表示:

import matplotlib.pyplot as plt
 
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
mobile = [30, 35, 40, 45]
desktop = [50, 45, 35, 30]
tablet = [20, 20, 25, 25]
 
plt.figure(figsize=(8, 6))
plt.bar(quarters, mobile, label='モバイル', color='#3498db')
plt.bar(quarters, desktop, bottom=mobile, label='デスクトップ', color='#e74c3c')
 
# 3番目の積み上げ用に累積のbottomを計算
import numpy as np
bottom_2 = np.array(mobile) + np.array(desktop)
plt.bar(quarters, tablet, bottom=bottom_2, label='タブレット', color='#2ecc71')
 
plt.ylabel('トラフィック(%)')
plt.title('四半期別トラフィックソース')
plt.legend()
plt.show()

エラーバー

import matplotlib.pyplot as plt
import numpy as np
 
categories = ['コントロール', '処理 A', '処理 B', '処理 C']
means = [10.2, 15.8, 14.3, 18.1]
errors = [1.2, 2.1, 1.8, 2.5]
 
plt.figure(figsize=(8, 5))
plt.bar(categories, means, yerr=errors, capsize=5,
        color='steelblue', edgecolor='black', linewidth=0.5)
plt.ylabel('応答値')
plt.title('エラーバー付き処理効果')
plt.show()

plt.bar() パラメータリファレンス

パラメータ説明
x配列風バーの位置(カテゴリ)
height配列風バーの高さ(値)
widthfloatバーの幅(デフォルト 0.8)
bottom配列風バーの底のY座標(積み上げ用)
color色または配列バーの塗りつぶし色
edgecolorバーの枠線の色
linewidthfloat枠線の幅
yerr / xerr配列風エラーバーのサイズ
capsizefloatエラーバーのキャップ幅
alignstrバーの配置('center' または 'edge')
labelstr凡例ラベル
alphafloat透明度(0-1)

PyGWalkerによるインタラクティブな棒グラフ

探索的データ分析には、PyGWalker (opens in a new tab)でJupyter内のDataFrameから列をドラッグ&ドロップしてインタラクティブな棒グラフを作成できます:

import pandas as pd
import pygwalker as pyg
 
df = pd.DataFrame({
    'Quarter': ['Q1', 'Q2', 'Q3', 'Q4'] * 3,
    'Product': ['A'] * 4 + ['B'] * 4 + ['C'] * 4,
    'Sales': [20, 35, 30, 35, 25, 32, 34, 20, 15, 20, 25, 30]
})
 
walker = pyg.walk(df)

FAQ

Matplotlibで棒グラフを作成するには?

垂直バーには plt.bar(カテゴリ, 値) を、水平バーには plt.barh(カテゴリ, 値) を使用します。カテゴリとその対応する値のリストまたは配列を渡します。plt.xlabel()plt.ylabel()plt.title() でラベルを追加します。

グループ化棒グラフを作成するには?

x位置には np.arange() を使用し、各グループをバーの幅でオフセットします。plt.bar() を異なるx位置で複数回呼び出します:plt.bar(x - width, data1, width)plt.bar(x, data2, width) など。plt.xticks(x, カテゴリ) で目盛りラベルを設定します。

バーの上に値ラベルを追加するには?

バーオブジェクトをループし、plt.text() を使用します。各バーについて、bar.get_x() + bar.get_width() / 2 で中央のx位置を、bar.get_height() でy位置を計算します。水平方向の配置には ha='center' を使用します。

積み上げ棒グラフを作成するには?

連続する plt.bar() 呼び出しで bottom パラメータを使用します。最初の呼び出しには bottom がありません。2番目の呼び出しは最初のデータセットを bottom として使用します。3番目の積み上げには、最初の2つのデータセットの合計を bottom として使用します。

水平バーと垂直バーのどちらを使うべきですか?

カテゴリラベルが長い場合、カテゴリが多い場合(8〜10以上)、またはベースラインと比較する場合は水平バー(plt.barh())を使用します。時系列カテゴリ(月、四半期)や短いラベルのカテゴリが少ない場合は垂直バー(plt.bar())を使用します。

まとめ

Matplotlibの plt.bar()plt.barh() は棒グラフのあらゆるニーズをカバーします:基本的な比較、グループ化されたマルチシリーズ、積み上げ構成、アノテーション付きプレゼンテーション。グループ化バーには np.arange() でx位置をオフセットします。積み上げバーには bottom パラメータを使用します。常に明確さのために値ラベルを追加し、ラベルが長い場合は水平レイアウトを選択してください。

📚