matplotlibでは、データのスカラー値を色に変換するために「colormap」を用います。自作のカラーマップを作成する方法として、大きく分けて次の3つがあります。
from_list
メソッドを使って簡単に連続カラーマップを作成ListedColormap
を使って離散的なカラーマップを作成LinearSegmentedColormap
を使って連続的なカラーマップを作成
以下、それぞれの方法について詳しく解説します。
from_listメソッドを使ったシンプルな連続カラーマップの作成
新しいバージョンのmatplotlibでは、LinearSegmentedColormap.from_list
を利用することで、色のリストからシンプルに連続的なカラーマップを作成することもできます。
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import numpy as np
# 色のリストを定義(例:青から白、そして赤へのグラデーション)
colors = ["blue", "white", "red"]
# from_listメソッドで連続的なカラーマップを作成
cmap = LinearSegmentedColormap.from_list("my_from_list_cmap", colors, N=256)
# ダミーデータの作成
data = np.linspace(0, 1, 100).reshape(10, 10)
# プロットしてカラーマップの動作を確認
plt.imshow(data, cmap=cmap)
plt.colorbar()
plt.title("from_listメソッドによるカラーマップ")
plt.show()

この方法は、シンプルなグラデーションを定義する場合に便利です。リスト内の色が順番に線形補間され、連続的なカラーマップが生成されます。
ListedColormapを使った離散的なカラーマップの作成
ListedColormap
は、特定の色をリストとして指定し、それらを離散的に適用するカラーマップです。
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np
# カラーマップに使用する色のリスト(例:赤、緑、青)
colors = ['#FF0000', '#00FF00', '#0000FF']
# ListedColormapの作成
cmap = ListedColormap(colors, name='my_listed_cmap')
# ダミーデータの作成
data = np.random.randint(0, 3, size=(10, 10))
# プロットしてカラーマップの動作を確認
plt.imshow(data, cmap=cmap)
plt.colorbar()
plt.title("ListedColormapを使ったカラーマップ")
plt.show()
この例では、数値0, 1, 2に対してそれぞれ赤、緑、青が割り当てられます。

LinearSegmentedColormapを使った連続的なカラーマップの作成
LinearSegmentedColormap
を使うと、色が滑らかに変化するカラーマップを作成できます。各色成分(赤、緑、青)の変化を辞書形式で細かく指定し、グラデーションを定義します。
segmentdata
引数に、色の変化を定義する辞書を与えます。赤 (red
)、緑 (green
)、青 (blue
)、および(必要ならば)アルファ (alpha
) の 4 つのキーを持つことができます。
各キー('red'
, 'green'
, 'blue'
, 'alpha'
)には、それぞれ タプルのリスト が対応しており、各タプルは (x, y0, y1)
の形をしています。
x
: 正規化された色位置(0.0
から1.0
の範囲)y0
:x
における開始値y1
:x
における終了値(補間に使用)
これらのタプルは、x
の値が 単調増加 になるように並べる必要があります。
これにより、色成分の線形補間が行われます。
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import numpy as np
# 辞書を使って連続的なカラーマップを定義
cdict = {
'red': ((0.0, 1.0, 1.0), # x=0で、R=1.0
(0.5, 0.0, 0.0), # x=0.5で、R=0.0
(1.0, 0.0, 0.0)), # x=1.0で、R=0.0
'green': ((0.0, 0.0, 0.0), # x=0で、G=0.0
(0.5, 1.0, 1.0), # x=0.5で、G=1.0
(1.0, 0.0, 0.0)), # x=1で、G=0.0
'blue': ((0.0, 0.0, 0.0), # x=0で、B=0.0
(0.5, 0.0, 0.0), # x=0.5で、B=0.0
(1.0, 1.0, 1.0)) # x=1.0で、B=1.0
}
# LinearSegmentedColormapの作成
cmap = LinearSegmentedColormap('my_linear_cmap', segmentdata=cdict, N=256)
# ダミーデータの作成
data = np.linspace(0, 1, 100).reshape(10, 10)
# プロットしてカラーマップの動作を確認
plt.imshow(data, cmap=cmap)
plt.colorbar()
plt.title("LinearSegmentedColormapを使ったカラーマップ")
plt.show()

この例では、データの値が0から1にかけて連続的に変化するため、指定したグラデーション(x=0では赤が強く、x=0.5で緑がピーク、x=1で青が強くなる)を線形補間して適用します。
y0
と y1
の意味
各 (x, y0, y1)
で、y0
と y1
の違いは次のようになります:
y0
は その点の直前の値y1
は その点の直後の値
これを利用すると、カラーマップの変化を急にするまたは滑らかにするといった調整が可能になります。
'red': [(0.0, 0.0, 0.0),
(0.5, 0.0, 1.0), # ここで 0 から 1 に急に変化
(1.0, 1.0, 1.0)]
この場合、x=0.5
で急に R
が増加します。
まとめ
- 離散的なカラーマップ:
ListedColormap
を使って、明確な色リストから作成する。 - 連続的なカラーマップ:
LinearSegmentedColormap
を用いて、各色成分の変化を詳細に指定する方法と、from_list
メソッドを使った簡易な定義方法がある。 - 利用例: 作成したカラーマップは、
imshow
やcontourf
などのプロット関数で利用でき、視覚的なデータ解析に役立ちます。