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 | 配列風 | バーの高さ(値) |
width | float | バーの幅(デフォルト 0.8) |
bottom | 配列風 | バーの底のY座標(積み上げ用) |
color | 色または配列 | バーの塗りつぶし色 |
edgecolor | 色 | バーの枠線の色 |
linewidth | float | 枠線の幅 |
yerr / xerr | 配列風 | エラーバーのサイズ |
capsize | float | エラーバーのキャップ幅 |
align | str | バーの配置('center' または 'edge') |
label | str | 凡例ラベル |
alpha | float | 透明度(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 パラメータを使用します。常に明確さのために値ラベルを追加し、ラベルが長い場合は水平レイアウトを選択してください。