matplotlibのカラーマップとは
matplotlibでグラフを作るとき、「色をどう指定するか」は見た目を大きく左右します。matplotlibには色の指定方法が複数あり、大きく分けると以下の2種類です。
- 単色指定(color引数):1本の線や1つの棒に対して特定の色を指定する
- カラーマップ(cmap引数):値の大小や連続的な変化に応じて色のグラデーションを割り当てる
カラーマップは散布図のヒートマップ、等高線図、scatterの点の色付けなど、「値に応じて色を変えたい」場面で使います。単色指定は折れ線グラフや棒グラフで「この系列はこの色」と固定したい場面に向いています。
この記事では、cmap(カラーマップ)の基本的な使い方から、colorによる単色・複数色の指定、よく使うカラーマップ一覧、注意点までを解説します。
カラーマップ(cmap)の基本的な使い方
カラーマップを使う代表的な例がscatter(散布図)です。点の色を第3の変数で表現できます。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
colors = x # 色に対応させる値
fig, ax = plt.subplots()
sc = ax.scatter(x, y, c=colors, cmap="viridis")
fig.colorbar(sc, ax=ax, label="x value")
ax.set_title("scatter with cmap='viridis'")
plt.show()
# グラフが表示される(x値が小さいほど紫、大きいほど黄色に近い色になる)
ポイントをまとめます。
c=に色に対応させたい配列を渡すcmap=にカラーマップ名を文字列で渡すfig.colorbar()でカラーバー(凡例)を表示できる
cmapは文字列で指定することが多いですが、matplotlib.colormaps["viridis"] のように取得したオブジェクトを渡す方法もあります。
よく使うカラーマップの種類
matplotlibには多くのカラーマップが用意されています。用途に合わせて選ぶのが基本です。
連続データ向け(Sequential)
値の大小を連続的に表現するときに使います。
| カラーマップ名 | 特徴 |
|---|---|
viridis | 青紫→緑→黄。視認性が高く、広く使われている |
plasma | 青紫→赤→黄。viridisより赤みが強い |
inferno | 黒→赤→黄 |
magma | 黒→紫→白 |
cividis | 青→黄。色覚異常でも見分けやすい |
発散データ向け(Diverging)
基準値(0など)から正負両方向に広がるデータに使います。
| カラーマップ名 | 特徴 |
|---|---|
coolwarm | 青(負)→白(中心)→赤(正) |
RdBu | 赤→白→青 |
bwr | 青→白→赤 |
カテゴリデータ向け(Qualitative)
カテゴリごとに異なる色を割り当てたいときに使います。
| カラーマップ名 | 特徴 |
|---|---|
tab10 | 10色の視認性の高いパレット |
tab20 | 20色のパレット |
Set1, Set2, Set3 | 少数カテゴリの色分けに向く |
カラーマップの一覧は以下のように確認できます。
import matplotlib as mpl
# 登録されているカラーマップ名を一覧表示する
print(list(mpl.colormaps))
# ['Accent', 'Accent_r', 'Blues', 'Blues_r', ..., 'viridis', 'viridis_r', ...]
末尾に _r が付くカラーマップは、元のカラーマップを逆順にしたものです。
ヒートマップでcmapを使う
ヒートマップでもカラーマップはよく使います。matplotlibのimshowやpcolormeshで指定できます。
import matplotlib.pyplot as plt
import numpy as np
data = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
fig, ax = plt.subplots()
im = ax.imshow(data, cmap="coolwarm")
fig.colorbar(im, ax=ax)
ax.set_title("imshow with cmap='coolwarm'")
plt.show()
# 値が小さいほど青、大きいほど赤のヒートマップが表示される
単色・複数色の指定(color引数)
カラーマップを使わず、単純に色を指定したい場合はcolor引数を使います。
単色の指定方法
matplotlibで使える色の指定形式は複数あります。
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 3, figsize=(10, 6))
# 色の指定方法のバリエーション
specs = [
("color='blue'", "blue"),
("color='#FF5733'", "#FF5733"),
("color=(0.2, 0.6, 0.9)", (0.2, 0.6, 0.9)),
("color='C0'", "C0"),
("color='tab:orange'", "tab:orange"),
("color='0.5'(グレー)", "0.5"),
]
for ax, (title, color) in zip(axes.flatten(), specs):
ax.bar([1], [1], color=color)
ax.set_title(title)
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()
# 各指定方法に対応した色の棒グラフが表示される
指定形式の一覧です。
| 指定方法 | 例 | 説明 |
|---|---|---|
| 色名 | "blue", "red" | CSSカラーネームが使える |
| 16進数 | "#FF5733" | RGB値のHEX表記 |
| RGBタプル | (0.2, 0.6, 0.9) | 0〜1の範囲で指定 |
| CN記法 | "C0", "C1" | デフォルトカラーサイクルの色 |
| Tableau色 | "tab:blue", "tab:orange" | tab10パレットの色 |
| グレースケール | "0.5" | 0が黒、1が白 |
複数の折れ線グラフに色のリストを使う
複数系列を一度に色指定したいときは、ループで色を指定する方法が手軽です。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
colors = ["tab:blue", "tab:orange", "tab:green"]
labels = ["sin", "cos", "tan(制限あり)"]
funcs = [np.sin, np.cos, lambda t: np.clip(np.tan(t), -3, 3)]
fig, ax = plt.subplots()
for func, color, label in zip(funcs, colors, labels):
ax.plot(x, func(x), color=color, label=label)
ax.legend()
ax.set_title("複数系列への色指定")
plt.show()
# 3本の折れ線がそれぞれ青・オレンジ・緑で表示される
カラーマップから色を取り出す
カラーマップをパレットのように使い、特定の色を取り出すこともできます。カテゴリ別の棒グラフなどで役立ちます。
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
cmap = mpl.colormaps["tab10"]
categories = ["A", "B", "C", "D", "E"]
values = [3, 7, 5, 9, 4]
# カラーマップから均等に色を取り出す
colors = [cmap(i / len(categories)) for i in range(len(categories))]
fig, ax = plt.subplots()
ax.bar(categories, values, color=colors)
ax.set_title("tab10カラーマップから色を取り出す")
plt.show()
# 各カテゴリが異なる色の棒グラフで表示される
cmap(0.0) 〜 cmap(1.0) の範囲で浮動小数点数を渡すと、カラーマップ上の対応する色(RGBAタプル)が返されます。
よくあるミスと注意点
cmapに存在しない名前を指定した場合
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3])
y = np.array([1, 2, 3])
# 存在しないカラーマップ名
plt.scatter(x, y, c=x, cmap="mycolor")
plt.show()
# KeyError: 'mycolor is not a known colormap name'
カラーマップ名はスペルミスに注意してください。名前が不明な場合はlist(mpl.colormaps)で一覧を確認できます。
colorとcmapを混在させると片方が無視される
scatterではcolor引数とc引数(cmapと組み合わせる)を同時に指定すると、片方が無視されます。
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3])
y = np.array([1, 2, 3])
# color と c を同時に指定するとWarningが出ることがある
plt.scatter(x, y, c=x, cmap="viridis", color="red")
plt.show()
# UserWarning: 'c' argument overrides 'color' argument.
# 結果として cmap による色が優先される
色のグラデーションを使う場合はcとcmapの組み合わせ、固定色を使う場合はcolorのみで指定するように分けましょう。
Seabornのpalette指定との違い
Seabornのpalette引数はカテゴリごとの色分けを主目的としており、matplotlibのcmapとは設計が異なります。Seabornのグラフ種類とコードについては、Seabornの主要なグラフ種類とさっと描きたい場合の最低限のコードで解説しています。
matplotlibとSeabornを混在させる場合、cmapとpaletteは互換性がないため、それぞれの引数仕様に従って指定してください。
Normalize(値の範囲のマッピング)に注意
カラーマップはデフォルトでデータの最小値〜最大値を0〜1に正規化して色をマッピングします。意図した範囲でマッピングしたい場合はvmin・vmaxで指定します。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 50)
y = np.random.rand(50)
colors = np.random.rand(50) * 100 # 0〜100の値
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
# vmin/vmaxなし(データの最小〜最大が0〜1にマップされる)
sc1 = axes[0].scatter(x, y, c=colors, cmap="viridis")
axes[0].set_title("vmin/vmax指定なし")
fig.colorbar(sc1, ax=axes[0])
# vmin/vmaxあり(0〜100を0〜1にマップ)
sc2 = axes[1].scatter(x, y, c=colors, cmap="viridis", vmin=0, vmax=100)
axes[1].set_title("vmin=0, vmax=100")
fig.colorbar(sc2, ax=axes[1])
plt.tight_layout()
plt.show()
# 左右のグラフで色のマッピング範囲が違うことが確認できる
AI時代での補足
AIがmatplotlibのコードを生成するとき、cmapの名前やvmin/vmaxの設定が意図と異なる場合があります。カラーマップの種類と値マッピングの仕組みを理解しておくと、出力されたコードが正しいかどうかを確認しやすくなります。
まとめ
この記事で解説した内容をまとめます。
- cmap(カラーマップ):値の大小に応じて色のグラデーションを割り当てる。
scatterやimshowでcmap=として指定 - color(単色指定):色名・HEX・RGBタプル・CN記法など複数の書き方がある
- よく使うカラーマップ:連続データには
viridis/plasma、発散データにはcoolwarm/RdBu、カテゴリにはtab10 - カラーマップから色を取り出す:
cmap(0.0〜1.0)でRGBAタプルを取得できる - 注意点:
colorとcの混在、vmin/vmaxによるマッピング範囲の制御
matplotlibの可視化全般を体系的に学びたい場合は、NumPyの基礎(配列の扱い)を先に押さえておくと理解しやすくなります。NumPyとは何か?配列操作と数値計算の基本を初心者向けに解説を参考にしてください。