注目キーワード
  1. Python
  2. コンペ

matplotlibのカラーマップ(cmap)と色指定の使い方を解説

  • 2026年6月4日
  • 2026年6月4日
  • Python
  • 3回
  • 0件

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)

カテゴリごとに異なる色を割り当てたいときに使います。

カラーマップ名特徴
tab1010色の視認性の高いパレット
tab2020色のパレット
Set1, Set2, Set3少数カテゴリの色分けに向く

カラーマップの一覧は以下のように確認できます。

import matplotlib as mpl

# 登録されているカラーマップ名を一覧表示する
print(list(mpl.colormaps))
# ['Accent', 'Accent_r', 'Blues', 'Blues_r', ..., 'viridis', 'viridis_r', ...]

末尾に _r が付くカラーマップは、元のカラーマップを逆順にしたものです。

ヒートマップでcmapを使う

ヒートマップでもカラーマップはよく使います。matplotlibのimshowpcolormeshで指定できます。

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 による色が優先される

色のグラデーションを使う場合はccmapの組み合わせ、固定色を使う場合はcolorのみで指定するように分けましょう。

Seabornのpalette指定との違い

Seabornのpalette引数はカテゴリごとの色分けを主目的としており、matplotlibのcmapとは設計が異なります。Seabornのグラフ種類とコードについては、Seabornの主要なグラフ種類とさっと描きたい場合の最低限のコードで解説しています。

matplotlibとSeabornを混在させる場合、cmappaletteは互換性がないため、それぞれの引数仕様に従って指定してください。

Normalize(値の範囲のマッピング)に注意

カラーマップはデフォルトでデータの最小値〜最大値を0〜1に正規化して色をマッピングします。意図した範囲でマッピングしたい場合はvminvmaxで指定します。

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(カラーマップ):値の大小に応じて色のグラデーションを割り当てる。scatterimshowcmap=として指定
  • color(単色指定):色名・HEX・RGBタプル・CN記法など複数の書き方がある
  • よく使うカラーマップ:連続データにはviridis/plasma、発散データにはcoolwarm/RdBu、カテゴリにはtab10
  • カラーマップから色を取り出すcmap(0.0〜1.0) でRGBAタプルを取得できる
  • 注意点colorcの混在、vmin/vmaxによるマッピング範囲の制御

matplotlibの可視化全般を体系的に学びたい場合は、NumPyの基礎(配列の扱い)を先に押さえておくと理解しやすくなります。NumPyとは何か?配列操作と数値計算の基本を初心者向けに解説を参考にしてください。

最新情報をチェックしよう!