Skip to content

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

Updated on

5 ready to go examples of matplilib cmaps/colormaps, which you can learn or directly copy to modify.

Matplotlib の colormap(cmap)システムは、単に「色のテーマを選ぶ」以上に多機能です。API を理解すると、次のようなことができます。

  • 連続値を可視化する(ヒートマップ、画像など)
  • 散布図で追加の次元を色にエンコードする
  • カテゴリ用の離散 colormap を作る
  • 対数や境界付きなどの非線形スケーリングで扱いづらいデータを表現する
  • colormap から色をサンプリングして、自分のプロットのスタイルに流用する

この記事では、5 つの典型的なパターンを、コードと実際のチャート出力付きで紹介します。各スニペットは、そのまま自分の notebook や script にコピペして使えます。

すべての例で、以下を前提とします。

import numpy as np
import matplotlib.pyplot as plt

1. imshow で連続 colormap を使う

colormap の最も基本的な使い方は、imshow で 2D 配列を可視化することです。たとえばヒートマップ、画像、規則的なグリッドデータなどです。

matplotlib-viridis-heatmap

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 を使う

散布図では、色を使って追加の数値次元(例:時間、強度、確率など)をエンコードできます。

Scatter plot with colormap and 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 はデフォルトでは連続ですが、少数の 離散色 を作ってカテゴリ(分類結果やラベルなど)を表現することもできます。

Discrete colormap for categories

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 など)を組み合わせます。

ogNorm colormap

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] の範囲へどうマッピングされるかを制御します。
  • pcolormeshimshow, scatter など、さまざまな描画関数と組み合わせられます。
  • 他にも Normalize, BoundaryNorm, PowerNorm などの正規化クラスがあります。

5. colormap から色をサンプリングして折れ線グラフに使う

colormap は「塗りつぶし」系のプロットだけのものではありません。colormap から個々の色を サンプリングして、折れ線グラフ、棒グラフ、注釈など、好きな場所に使うこともできます。

Sampling colors from a colormap for line plots

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 の日常的な使い方の多くをカバーできます。

  1. imshow + cmap を使った 連続ヒートマップ
  2. 色で追加の値の次元を表現する 散布図
  3. ListedColormap を用いた カテゴリ用の離散色
  4. LogNorm(など)と colormap を組み合わせた 非線形スケーリング
  5. colormap から色をサンプリングして折れ線や棒グラフなどを装飾する カスタムスタイル

これらに慣れてきたら、次のようなトピックも試してみるとよいでしょう。

  • 独自の色リストや外部ツールから作るカスタム colormap
  • 値の範囲(ビン)ごとに色を割り当てる BoundaryNorm
  • 読みやすさとアクセシビリティに配慮した知覚的一様 colormap(viridis, plasma, cividis など)