matplotlibのcolormapを設定する方法を解説

Python

本記事では、matplotlibのcolormapを設定する方法を解説します。適切なcolormapを選ぶことで、データがより見やすくなり、情報をより効果的に伝えることができます。

colormapとは

colormapとは、データの値を色に変換するものです。matplotlibでは、様々な種類のcolormapが用意されており、データの性質に合わせて最適なものを選択することが重要です。

以下は基本的なcolormapの使用例です。

import matplotlib.pyplot as plt
import numpy as np

# データの作成
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)

# colormapを指定してプロット
plt.figure(figsize=(8, 6))
plt.pcolormesh(X, Y, Z, cmap='viridis')
plt.colorbar(label='Value')
plt.title('Basic Colormap Example: viridis')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()

# 出力: viridisカラーマップを使用したカラフルな2D図が表示される

様々なcolormap

matplotlibには大きく分けて5種類のcolormapがあります。それぞれのカテゴリは特定のデータタイプや視覚化の目的に適しています。

Sequential

連続的なデータを表現するのに適したcolormapです。一方の端から他方の端まで、単調に明るさや彩度が変化します。

利用シーン:

  • 一方向に増加または減少する連続的なデータ(温度、高度、濃度など)
  • 0から始まる累積データ
  • 正の値のみを持つデータセット

以下は、Sequentialカラーマップの例です。

import matplotlib.pyplot as plt
import numpy as np

# データの作成
data = np.random.rand(10, 10)

# 複数のSequentialカラーマップを比較
cmaps = ['Blues', 'Greens', 'Oranges', 'viridis', 'plasma']

fig, axes = plt.subplots(1, len(cmaps), figsize=(15, 3))
fig.suptitle('Sequential Colormaps')

for i, cmap in enumerate(cmaps):
    im = axes[i].imshow(data, cmap=cmap)
    axes[i].set_title(cmap)
    axes[i].axis('off')
    
plt.tight_layout()
plt.show()

# 出力: 5つの異なるSequentialカラーマップを使用した画像が横に並ぶ

Diverging

中央の基準値から両方向に離れていくデータを表現するのに適したcolormapです。中央は通常中間色(白や灰色など)で、両端は対照的な色になっています。

利用シーン:

  • 正負の値を持つデータ(相関係数、温度偏差など)
  • 平均値や基準値からの偏差
  • 意見調査(賛成/反対)のような両極性のあるデータ

以下は、Divergingカラーマップの例です。

import matplotlib.pyplot as plt
import numpy as np

# -1から1の範囲のデータを作成
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
Z = X * Y

# 複数のDivergingカラーマップを比較
cmaps = ['coolwarm', 'RdBu', 'BrBG', 'PiYG', 'PRGn']

fig, axes = plt.subplots(1, len(cmaps), figsize=(15, 3))
fig.suptitle('Diverging Colormaps')

for i, cmap in enumerate(cmaps):
    im = axes[i].imshow(Z, cmap=cmap, vmin=-9, vmax=9)
    axes[i].set_title(cmap)
    axes[i].axis('off')
    
plt.tight_layout()
plt.colorbar(im, ax=axes, orientation='horizontal', pad=0.1)
plt.show()

# 出力: 5つの異なるDivergingカラーマップを使用した画像が横に並ぶ

Cyclic

周期的なデータを表現するのに適したcolormapです。始点と終点の色が同じになっており、連続的に循環します。

利用シーン:

  • 角度や位相のデータ(風向、時間帯など)
  • 季節変動のような周期的な現象
  • 極座標系のデータ可視化

以下は、Cyclicカラーマップの例です。

import matplotlib.pyplot as plt
import numpy as np

# 角度データの作成(ラジアン)
theta = np.linspace(0, 2*np.pi, 100)
r = np.linspace(0, 1, 50)
Theta, R = np.meshgrid(theta, r)
Z = np.sin(5*Theta)

# 複数のCyclicカラーマップを比較
cmaps = ['twilight', 'twilight_shifted', 'hsv']

fig, axes = plt.subplots(1, len(cmaps), figsize=(15, 4), subplot_kw={'projection': 'polar'})
fig.suptitle('Cyclic Colormaps')

for i, cmap in enumerate(cmaps):
    im = axes[i].pcolormesh(Theta, R, Z, cmap=cmap)
    axes[i].set_title(cmap)
    axes[i].set_xticks([])
    axes[i].set_yticks([])
    
plt.tight_layout()
plt.show()

# 出力: 3つの異なるCyclicカラーマップを使用した極座標プロットが横に並ぶ

Qualitative

カテゴリカルデータを表現するのに適したcolormapです。関連性のない離散的なカテゴリを区別するために、明確に異なる色を使用します。

利用シーン:

  • カテゴリデータ(国、製品種類、グループなど)
  • 離散的なクラスの分類結果
  • 複数の独立したデータ系列の区別

以下は、Qualitativeカラーマップの例です。

import matplotlib.pyplot as plt
import numpy as np

# カテゴリデータの作成
categories = ['Category A', 'Category B', 'Category C', 'Category D', 'Category E']
values = [23, 45, 56, 78, 32]

# 複数のQualitativeカラーマップを比較
cmaps = ['tab10', 'Set1', 'Set2', 'Dark2', 'Pastel1']

fig, axes = plt.subplots(len(cmaps), 1, figsize=(10, 10))
fig.suptitle('Qualitative Colormaps')

for i, cmap in enumerate(cmaps):
    cmap_obj = plt.cm.get_cmap(cmap, len(categories))
    colors = [cmap_obj(j) for j in range(len(categories))]
    
    axes[i].bar(categories, values, color=colors)
    axes[i].set_title(cmap)
    axes[i].set_ylim(0, 100)
    
plt.tight_layout()
plt.show()

# 出力: 5つの異なるQualitativeカラーマップを使用した棒グラフが縦に並ぶ

Miscellaneous

上記のカテゴリに分類されない特殊な目的のcolormapです。特定の視覚化タスクに特化しています。

利用シーン:

  • 特殊な視覚効果が必要な場合
  • 特定の科学分野の慣習に従う必要がある場合
  • 特定のブランドカラーに合わせる必要がある場合

以下は、Miscellaneousカラーマップの例です。

import matplotlib.pyplot as plt
import numpy as np

# データの作成
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y) * np.exp(-0.1 * (X**2 + Y**2))

# 複数のMiscellaneousカラーマップを比較
cmaps = ['flag', 'prism', 'ocean', 'gist_earth', 'terrain']

fig, axes = plt.subplots(1, len(cmaps), figsize=(15, 3))
fig.suptitle('Miscellaneous Colormaps')

for i, cmap in enumerate(cmaps):
    im = axes[i].imshow(Z, cmap=cmap)
    axes[i].set_title(cmap)
    axes[i].axis('off')
    
plt.tight_layout()
plt.show()

# 出力: 5つの異なるMiscellaneousカラーマップを使用した画像が横に並ぶ

カスタムcolormapの作成

特定のニーズに合わせてカスタムcolormapを作成することも可能です。以下は、カスタムcolormapを作成する例です。

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np

# カスタムカラーマップの作成
colors = [(0, 0, 0.8), (0, 0.8, 0), (0.8, 0, 0)]  # 青、緑、赤
cmap_name = 'custom_bgr'
custom_cmap = mcolors.LinearSegmentedColormap.from_list(cmap_name, colors)

# データの作成
data = np.random.rand(10, 10)

# カスタムカラーマップの使用
plt.figure(figsize=(8, 6))
plt.imshow(data, cmap=custom_cmap)
plt.colorbar(label='Value')
plt.title('Custom Colormap Example')
plt.show()

# 出力: 青から緑、赤へと変化するカスタムカラーマップを使用した画像

まとめ

matplotlibのcolormapは、データの性質に合わせて適切に選択することで、視覚化の効果を最大限に高めることができます。

  • Sequential: 一方向に変化する連続データに最適
  • Diverging: 中心から両方向に変化するデータに最適
  • Cyclic: 周期的なデータに最適
  • Qualitative: カテゴリカルデータに最適
  • Miscellaneous: 特殊な目的に応じたcolormap

適切なcolormapを選ぶことで、データの傾向や特徴をより明確に伝えることができます。また、アクセシビリティに配慮したcolormapを使用することで、理解しやすい視覚化を実現できます。

タイトルとURLをコピーしました