Matplotlib Colormap(cmaps)のよくある使い方 5選
Updated on

Matplotlib の colormap(cmap)システムは、単に「色のテーマを選ぶ」以上に多機能です。API を理解すると、次のようなことができます。
- 連続値を可視化する(ヒートマップ、画像など)
- 散布図で追加の次元を色にエンコードする
- カテゴリ用の離散 colormap を作る
- 対数や境界付きなどの非線形スケーリングで扱いづらいデータを表現する
- colormap から色をサンプリングして、自分のプロットのスタイルに流用する
この記事では、5 つの典型的なパターンを、コードと実際のチャート出力付きで紹介します。各スニペットは、そのまま自分の notebook や script にコピペして使えます。
すべての例で、以下を前提とします。
import numpy as np
import matplotlib.pyplot as plt1. imshow で連続 colormap を使う
colormap の最も基本的な使い方は、imshow で 2D 配列を可視化することです。たとえばヒートマップ、画像、規則的なグリッドデータなどです。

Code
import numpy as np
import matplotlib.pyplot as plt
# Generate some random-ish 2D data
data = np.random.randn(50, 50).cumsum(axis=0)
plt.figure()
plt.imshow(data, cmap="viridis")
plt.colorbar()
plt.title("Continuous colormap with imshow (viridis)")
plt.tight_layout()
plt.show()Chart
知覚的に一様な colormap である viridis を使った、滑らかな ヒートマップ が得られます。
(上の最初の画像に対応します。紫から緑へと変化するヒートマップと colorbar が表示されます。)
ポイント:
cmap="viridis"で colormap を選択しています。plt.colorbar()で、値の解釈に必要なカラースケールを描画します。- 任意の 2D NumPy 配列を
imshowに渡せます。
2. 散布図で colormap と colorbar を使う
散布図では、色を使って追加の数値次元(例:時間、強度、確率など)をエンコードできます。

Code
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
x = np.linspace(0, 10, 200)
y = np.sin(x) + 0.1 * np.random.randn(200)
# A separate value for each point, mapped to a colormap
values = np.linspace(0, 1, 200)
plt.figure()
scatter = plt.scatter(x, y, c=values, cmap="plasma")
plt.colorbar(scatter, label="value")
plt.title("Scatter with colormap (plasma)")
plt.xlabel("x")
plt.ylabel("sin(x) + noise")
plt.tight_layout()
plt.show()Chart
plasma colormap に沿って色が滑らかに変化する 散布図 と、その色が何を意味するのかを示す colorbar が描画されます。
ポイント:
c=valuesで、色にマッピングする数値データを渡しています。cmap="plasma"で colormap を指定しています。plt.colorbar()にはscatterオブジェクトを渡すことで、一致した colorbar を得られます。
3. カテゴリ用の離散 colormap
colormap はデフォルトでは連続ですが、少数の 離散色 を作ってカテゴリ(分類結果やラベルなど)を表現することもできます。

Code
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
# Fake 4-category classification
categories = np.random.randint(0, 4, 100)
x = np.random.randn(100)
y = np.random.randn(100)
# Build a discrete colormap from the first 4 colors of tab10
base_cmap = plt.cm.tab10
cmap_disc = ListedColormap(base_cmap(np.linspace(0, 1, 4)))
plt.figure()
for i in range(4):
mask = categories == i
# Use a single color for each class
plt.scatter(x[mask], y[mask], c=[cmap_disc(i)], label=f"class {i}")
plt.legend()
plt.title("Discrete colormap for categories (tab10 subset)")
plt.xlabel("x")
plt.ylabel("y")
plt.tight_layout()
plt.show()Chart
カテゴリ 0〜3 のそれぞれに tab10 から取ってきた異なる色が割り当てられた散布図が表示されます。
ポイント:
ListedColormapを使うと、色リストから colormap を構成できます。- 少数のカテゴリに対して、安定した(固定の)色を使いたい場合に便利です。
- ここでは定番の定性 colormap である
tab10から 4 色を取り出して使っています。
4. colormap と正規化(LogNorm)を組み合わせる
データのスケールが何桁も異なる場合、値を線形に色へマッピングすると構造が見えづらくなることがあります。そんなときは、colormap と 正規化関数(LogNorm など)を組み合わせます。

Code
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
x = np.linspace(0.01, 2, 200)
y = np.linspace(0.01, 2, 200)
X, Y = np.meshgrid(x, y)
Z = np.exp(X * Y) # Grows very quickly
plt.figure()
pcm = plt.pcolormesh(X, Y, Z, norm=LogNorm(), cmap="magma")
plt.colorbar(pcm, label="exp(x * y)")
plt.title("LogNorm with colormap (magma)")
plt.xlabel("x")
plt.ylabel("y")
plt.tight_layout()
plt.show()Chart
magma を使った 2D のカラーフィールドが表示され、小さい値と大きい値の両方の領域構造が、対数スケーリングのおかげで見やすくなります。
ポイント:
norm=LogNorm()によって、値がcmapを適用する前に [0, 1] の範囲へどうマッピングされるかを制御します。pcolormeshやimshow,scatterなど、さまざまな描画関数と組み合わせられます。- 他にも
Normalize,BoundaryNorm,PowerNormなどの正規化クラスがあります。
5. colormap から色をサンプリングして折れ線グラフに使う
colormap は「塗りつぶし」系のプロットだけのものではありません。colormap から個々の色を サンプリングして、折れ線グラフ、棒グラフ、注釈など、好きな場所に使うこともできます。

Code
import numpy as np
import matplotlib.pyplot as plt
cmap = plt.cm.cividis # choose any colormap you like
xs = np.linspace(0, 10, 200)
plt.figure()
for i, freq in enumerate(np.linspace(0.5, 2.5, 6)):
ys = np.sin(freq * xs)
color = cmap(i / 5.0) # sample evenly across the colormap
plt.plot(xs, ys, label=f"freq={freq:.1f}", color=color)
plt.legend(title="frequency")
plt.title("Sampling colors from colormap (cividis)")
plt.xlabel("x")
plt.ylabel("sin(freq * x)")
plt.tight_layout()
plt.show()Chart
cividis から取り出した色を使った複数の正弦波が表示され、色が colormap に沿って滑らかに変化します。
ポイント:
plt.cm.<name>で colormap オブジェクトを取得し、それを 関数のように呼び出すことができます。cmap(t)は、tを[0, 1]の値として受け取り、その位置の RGBA 色を返します。- これを使うと、一貫性があり見た目のよいカラーパレットを簡単に作れます。
まとめ
ここで紹介した 5 つのパターンで、Matplotlib colormap の日常的な使い方の多くをカバーできます。
imshow+cmapを使った 連続ヒートマップ。- 色で追加の値の次元を表現する 散布図。
ListedColormapを用いた カテゴリ用の離散色。LogNorm(など)と colormap を組み合わせた 非線形スケーリング。- colormap から色をサンプリングして折れ線や棒グラフなどを装飾する カスタムスタイル。
これらに慣れてきたら、次のようなトピックも試してみるとよいでしょう。
- 独自の色リストや外部ツールから作るカスタム colormap
- 値の範囲(ビン)ごとに色を割り当てる
BoundaryNorm - 読みやすさとアクセシビリティに配慮した知覚的一様 colormap(
viridis,plasma,cividisなど)