Matplotlib 散布図:plt.scatter() 完全ガイド
Updated on
散布図は、2つの数値変数間の関係を探索するための定番の可視化手法です。しかし、効果的な散布図を作成するには -- パターン、クラスター、外れ値を、ごちゃごちゃにならずに明らかにする散布図を作るには -- 単純な plt.scatter() の呼び出しだけでは不十分です。カテゴリ用のカラーマッピング、第3変数用のサイズエンコーディング、適切な軸ラベル、そして重なり合うポイントの処理が必要です。
Matplotlibの plt.scatter() は豊富なパラメータセットでこれらすべてに対応しています。このガイドでは、基本的な散布図から、バブルチャート、回帰線、マルチパネル散布図行列などの高度なテクニックまで、すべてをカバーします。
基本的な散布図
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100)
y = 2 * x + np.random.randn(100) * 0.5
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.xlabel('X値')
plt.ylabel('Y値')
plt.title('基本的な散布図')
plt.show()マーカーのカスタマイズ
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(50)
y = np.random.randn(50)
plt.figure(figsize=(8, 6))
plt.scatter(x, y,
s=100, # マーカーサイズ
c='steelblue', # 色
marker='o', # マーカー形状
alpha=0.7, # 透明度
edgecolors='black', # 枠線の色
linewidths=0.5, # 枠線の幅
)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('カスタマイズされた散布図')
plt.show()一般的なマーカー形状
| マーカー | 記号 | 説明 |
|---|---|---|
'o' | 円 | デフォルト |
's' | 正方形 | |
'^' | 上三角 | |
'D' | ダイヤモンド | |
'*' | 星 | |
'+' | プラス | |
'x' | クロス | |
'.' | 点 | 小さい、密なデータ用 |
カテゴリ別の色分け
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 50
# 3つのカテゴリ
categories = ['A', 'B', 'C']
colors = ['#e74c3c', '#3498db', '#2ecc71']
plt.figure(figsize=(8, 6))
for cat, color in zip(categories, colors):
x = np.random.randn(n) + (categories.index(cat) * 2)
y = np.random.randn(n) + (categories.index(cat) * 1.5)
plt.scatter(x, y, c=color, label=cat, alpha=0.7, s=60, edgecolors='white')
plt.xlabel('特徴量 1')
plt.ylabel('特徴量 2')
plt.title('カテゴリ別に色分けした散布図')
plt.legend()
plt.show()カラーマッピング(連続変数)
c パラメータに数値配列とカラーマップを使用して、第3変数を色としてエンコードします:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(200)
y = np.random.randn(200)
values = x ** 2 + y ** 2 # 原点からの距離
plt.figure(figsize=(8, 6))
scatter = plt.scatter(x, y, c=values, cmap='viridis', s=50, alpha=0.8)
plt.colorbar(scatter, label='原点からの距離')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('カラーマッピング付き散布図')
plt.show()人気のカラーマップ
| カラーマップ | タイプ | 最適な用途 |
|---|---|---|
'viridis' | 連続 | デフォルト、知覚的に均一 |
'plasma' | 連続 | 高コントラスト |
'coolwarm' | 発散 | 正/負の値 |
'RdYlGn' | 発散 | 良い/悪いの範囲 |
'Set1' | 定性的 | カテゴリカルデータ |
サイズエンコーディング(バブルチャート)
第3変数をマーカーサイズとしてエンコードして、バブルチャートを作成します:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
countries = ['US', 'China', 'India', 'Germany', 'Japan', 'UK', 'Brazil', 'France']
gdp = np.array([21.43, 14.34, 2.87, 3.86, 5.08, 2.83, 1.87, 2.72])
population = np.array([331, 1402, 1380, 83, 126, 67, 213, 67])
growth = np.array([2.3, 5.8, 6.5, 1.1, 0.8, 1.4, 1.2, 1.5])
plt.figure(figsize=(10, 7))
scatter = plt.scatter(gdp, growth,
s=population * 2, # 人口を可視サイズにスケーリング
c=range(len(countries)),
cmap='tab10',
alpha=0.6,
edgecolors='black',
)
for i, country in enumerate(countries):
plt.annotate(country, (gdp[i], growth[i]),
textcoords="offset points", xytext=(10, 5), fontsize=9)
plt.xlabel('GDP(兆USD)')
plt.ylabel('GDP成長率(%)')
plt.title('GDP vs 成長率(バブルサイズ = 人口)')
plt.show()回帰線の追加
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 3
y = 1.5 * x + np.random.randn(100) * 2
# 線形回帰をフィット
coefficients = np.polyfit(x, y, 1)
poly = np.poly1d(coefficients)
x_line = np.linspace(x.min(), x.max(), 100)
plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.6, s=40, label='データ')
plt.plot(x_line, poly(x_line), 'r-', linewidth=2,
label=f'y = {coefficients[0]:.2f}x + {coefficients[1]:.2f}')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('回帰線付き散布図')
plt.legend()
plt.show()重なり合うポイントの処理
ポイントが大量に重なる場合は、透明度、小さいマーカー、または密度ベースの手法を使用します:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(5000)
y = np.random.randn(5000)
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# 方法1:透明度
axes[0].scatter(x, y, alpha=0.1, s=10)
axes[0].set_title('アルファ透明度')
# 方法2:小さいマーカー
axes[1].scatter(x, y, s=1, c='black')
axes[1].set_title('小さいマーカー')
# 方法3:2Dヒストグラム(hexbin)
axes[2].hexbin(x, y, gridsize=30, cmap='YlOrRd')
axes[2].set_title('Hexbin密度')
plt.tight_layout()
plt.show()複数のサブプロット
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 100
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
# プロット1:線形
x1 = np.random.randn(n)
axes[0, 0].scatter(x1, 2 * x1 + np.random.randn(n) * 0.5, c='steelblue', s=30)
axes[0, 0].set_title('線形関係')
# プロット2:二次
x2 = np.linspace(-3, 3, n)
axes[0, 1].scatter(x2, x2**2 + np.random.randn(n) * 0.5, c='coral', s=30)
axes[0, 1].set_title('二次関係')
# プロット3:クラスター
for i, c in enumerate(['red', 'blue', 'green']):
cx = np.random.randn(30) + i * 3
cy = np.random.randn(30) + i * 2
axes[1, 0].scatter(cx, cy, c=c, s=30, alpha=0.7)
axes[1, 0].set_title('クラスターデータ')
# プロット4:相関なし
axes[1, 1].scatter(np.random.randn(n), np.random.randn(n), c='purple', s=30, alpha=0.5)
axes[1, 1].set_title('相関なし')
plt.tight_layout()
plt.show()PyGWalkerによるインタラクティブな散布図
探索的データ分析において、静的な散布図は出発点に過ぎません。PyGWalker (opens in a new tab)は、pandasのDataFrameをJupyter内で直接インタラクティブなTableauスタイルのインターフェースに変換します。列を軸にドラッグし、色やサイズのエンコーディングを追加し、データをフィルタリングできます -- すべて追加コードなしで:
import pandas as pd
import pygwalker as pyg
df = pd.DataFrame({'x': x, 'y': y, 'category': np.random.choice(['A', 'B', 'C'], len(x))})
walker = pyg.walk(df)plt.scatter() パラメータリファレンス
| パラメータ | 型 | 説明 |
|---|---|---|
x, y | 配列風 | データ位置 |
s | スカラーまたは配列 | マーカーサイズ(ポイント^2) |
c | 色または配列 | マーカーの色。配列でカラーマップ |
marker | str | マーカースタイル('o', 's', '^'など) |
cmap | strまたはColormap | cが数値の場合のカラーマップ |
alpha | float (0-1) | 透明度 |
edgecolors | 色 | マーカーの枠線の色 |
linewidths | float | マーカーの枠線の幅 |
vmin, vmax | float | カラーマップの範囲制限 |
label | str | 凡例ラベル |
FAQ
Matplotlibで散布図を作成するには?
plt.scatter(x, y) を使用します。xとyは同じ長さの配列です。plt.xlabel()、plt.ylabel()、plt.title() でラベルを追加します。plt.show() を呼び出してプロットを表示します。
散布図のポイントをカテゴリ別に色分けするには?
カテゴリをループし、それぞれに異なる c パラメータと label を持つ plt.scatter() を呼び出します。次に plt.legend() を呼び出して凡例を表示します。あるいは、連続的な色付けのためにカラーマップ付きの数値配列を c に渡すこともできます。
散布図にトレンドラインを追加するには?
np.polyfit(x, y, 次数) を使用して多項式をフィットし、係数から np.poly1d() を作成し、plt.plot() で描画します。次数=1の場合、線形回帰線が得られます。
plt.scatter()とplt.plot()の違いは?
plt.scatter() は各ポイントのサイズ、色、形状を個別に制御できる個別のマーカーを作成します。plt.plot() はマーカースタイルを指定すると均一な外観の接続されたポイントを作成します。ポイントに個別のスタイリングが必要な場合は scatter() を、折れ線グラフや均一なマーカーには plot() を使用します。
散布図で重なり合うポイントをどう処理する?
alpha(透明度)を使用して密度を可視化し、マーカーサイズ s を小さくし、plt.hexbin() で密度ヒートマップを使用するか、小さなランダムオフセットでポイントをわずかにずらします。
まとめ
Matplotlibの plt.scatter() はPythonで散布図を作成する標準ツールです。基本的な探索には、シンプルな plt.scatter(x, y) で十分です。出版品質の図を作成するには、カテゴリ用のカラーマッピング、第3変数用のサイズエンコーディング、トレンド用の回帰線、密なデータ用の透明度を活用してください。これらのテクニックをマスターすれば、あらゆる二変量関係を効果的に可視化できます。