カテゴリ別の散布図に注釈を追加

中級

6.5.6

カテゴリ別の散布図に注釈を追加

最終更新 2020-04-08 読了時間 1 分
まとめ
  • カテゴリ別に色分けし、平均線や注釈で洞察を補足した散布図。
  • ax.annotateaxvline/axhline で基準線・矢印付き注釈を追加する。
  • グループ間の違いや注目領域を第三者に説明するプレゼン用途で使う。

クラスタごとに色分けし、平均値ラインと注釈を加えた散布図です。注目してほしい領域をテキストで示すと伝わりやすくなります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(0)
cluster = np.concatenate([np.full(80, "A"), np.full(70, "B"), np.full(60, "C")])
x = np.concatenate([rng.normal(40, 6, 80), rng.normal(55, 5, 70), rng.normal(65, 4, 60)])
y = np.concatenate([rng.normal(70, 5, 80), rng.normal(60, 6, 70), rng.normal(80, 5, 60)])
palette = {"A": "#2563eb", "B": "#10b981", "C": "#f97316"}

fig, ax = plt.subplots(figsize=(6, 4))
for cat in np.unique(cluster):
    mask = cluster == cat
    ax.scatter(x[mask], y[mask], label=f"グループ {cat}", color=palette[cat], alpha=0.75, edgecolors="white", s=60)

ax.axvline(np.mean(x), color="#9ca3af", linestyle="--", linewidth=1)
ax.axhline(np.mean(y), color="#9ca3af", linestyle="--", linewidth=1)

ax.annotate(
    "高スコア帯",
    xy=(66, 84),
    xytext=(72, 90),
    arrowprops=dict(arrowstyle="->", color="#1f2937"),
    fontsize=11,
)

ax.set_xlabel("評価指標 X")
ax.set_ylabel("評価指標 Y")
ax.set_title("カテゴリ別散布図と注釈")
ax.legend()
ax.grid(alpha=0.3)

fig.tight_layout()

plt.show()

注目してほしい領域をテキストで示すと伝わりやすくなりますの図

読み方のポイント #

  • 平均線を描くと全体の基準が分かり、各クラスターの位置付けを説明しやすくなる。
  • 注釈は矢印やハイライトと組み合わせると視線が誘導できる。
  • 凡例の順序を重視順・規模順に並べ替えると、意思決定者への説明がスムーズ。

いつ使うか #

  • 適している場面: カテゴリごとの散布点にラベルや注釈を付けて特徴的なデータ点を強調したいとき。
  • 不向きな場面: 注釈が多すぎるとラベルが重なり読めなくなるため、数十点以上ある場合は厳選が必要です。
  • 代替手段: インタラクティブなツールチップ付きプロット(Plotly等)にすればホバーで全点の情報を確認できます。

よくある失敗パターン #

  • ラベルの重なり: 注釈が密集するとテキストが重なり判読不能になります。adjustText ライブラリや手動オフセットで重なりを解消してください。
  • 注釈の付けすぎ: すべてのデータ点に注釈を付けると情報過多でかえって読めません。特徴的な点だけに絞って注釈するのが効果的です。