Pynote

Python、機械学習、画像処理について

matplotlib - カラーマップについて

カラーマップ

カラーマップ (color map) は、描画する際に使用する値と色の対応関係を表す。
カラーマップの選択は、データを見やすく描写するために重要である。
表示するデータの種類に応じて、カラーマップが分類されている。

使い方

一部の関数は cmap 引数をとるようになっているので、カラーマップの名前を指定する。

def f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

# 関数の入力を作成する。
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)

# 関数の値を計算する。
Z = f(X, Y)

# 等高線を可視化する。
plt.contour(X, Y, Z, 20, cmap='viridis')
plt.show()


Sequencial (連続)

小さい値から大きい値にかけて、区別したいデータに利用する。(例: 気温)


Diverging (発散)

中心となる値から正または負の方向にどの程度離れているかを可視化する場合に利用する。(例: 水素イオン指数 Ph)


Cyclic (周期)

値が周期的性質を持つデータを可視化する場合に利用する。(例: 時刻、角度)


Qualitative (定性)

各値が関連を持たないデータを可視化する場合に利用する。(例: 円グラフ)


カラーマップ一覧を生成したコード

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
from collections import OrderedDict

cmaps = OrderedDict()

cmaps['Perceptually Uniform Sequential'] = [
    'inferno', 'magma', 'plasma', 'viridis']

cmaps['Sequential'] = [
    'Blues', 'BuGn', 'BuPu', 'GnBu',
    'Greens', 'Greys', 'OrRd', 'Oranges',
    'PuBu', 'PuBuGn', 'PuRd', 'Purples',
    'RdPu', 'Reds', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd']

cmaps['Sequential (2)'] = [
    'binary', 'gist_yarg', 'gist_gray', 'gray',
    'bone', 'pink', 'spring', 'summer',
    'autumn', 'winter', 'cool', 'Wistia',
    'hot', 'afmhot', 'gist_heat', 'copper']

cmaps['Diverging'] = [
    'PiYG', 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu', 'RdYlBu',
    'RdYlGn', 'Spectral', 'coolwarm', 'bwr', 'seismic']

cmaps['Qualitative'] = [
    'Pastel1', 'Pastel2', 'Paired', 'Accent', 'Dark2',
    'Set1', 'Set2', 'Set3', 'tab10', 'tab20', 'tab20b', 'tab20c']

cmaps['Miscellaneous'] = [
    'flag', 'prism', 'ocean', 'gist_earth', 'terrain', 'gist_stern', 'gnuplot',
    'gnuplot2', 'CMRmap', 'cubehelix', 'brg', 'hsv', 'gist_rainbow', 'rainbow',
    'jet', 'nipy_spectral', 'gist_ncar']

# 表示するデータとして (1, 256) の配列を作成する。
gradient = np.linspace(0, 1, 256).reshape(1, -1)

def plot_color_maps(cmap_category, cmap_list):
    num_cmaps = len(cmap_list)
    fig, axes = plt.subplots(num_cmaps, 2, figsize=(9, num_cmaps * 0.35))
    fig.subplots_adjust(wspace=0.4)
    axes[0][0].set_title(cmap_category + ' colormaps', fontsize=14, x=1.2)
    
    def plot_color_map(ax, gradient, name):
        ax.imshow(gradient, aspect='auto', cmap=name)
        ax.set_axis_off()
        ax.text(-10, 0, name, va='center', ha='right', fontsize=10)
    
    for [axL, axR], name in zip(axes, cmap_list):
        plot_color_map(axL, gradient, name)
        plot_color_map(axR, gradient, name + '_r')

for cmap_category, cmap_list in cmaps.items():
    plot_color_maps(cmap_category, cmap_list)

plt.show()