Python Matplotlib を使用したカスタムカラーマップ

Aditya Raj 2023年1月30日
  1. Python Matplotlib を使用してカスタムカラーマップを作成する
  2. Python Matplotlib の get_cmap() メソッドを使用してカラーマップとその値にアクセスする
  3. Python で ListedColormap オブジェクトの colors 属性を使用してカスタムリストカラーマップを作成する
  4. Python でカスタム線形セグメント化カラーマップを作成する方法は
  5. まとめ
Python Matplotlib を使用したカスタムカラーマップ

カラーマップは、グラフの連続値と離散値の間の変動を示すための最も効果的な方法の 1つです。この記事では、Python で Matplotlib を使用してカスタムカラーマップを作成する方法について説明します。

Python Matplotlib を使用してカスタムカラーマップを作成する

matplotlib ライブラリは、さまざまな組み込みのカラーマップを提供します。ただし、カラーマップを操作したり、カスタムカラーマップを作成したりする必要があるとします。その場合、ListedColormap クラスまたは matplotlib ライブラリで定義された LinearSegmentedColormap クラスを使用してそれを行うことができます。

カスタムカラーマップを作成する前に、まず Matplotlib カラーマップの値にアクセスしてカラーマップの実装を理解する方法について説明しましょう。これにより、独自に選択したカスタムカラーマップを作成できるようになります。

Python Matplotlib の get_cmap() メソッドを使用してカラーマップとその値にアクセスする

Matplotlib モジュールで定義されているさまざまなカラーマップがあります。各カラーマップには固有の名前が割り当てられています。matplotlib ライブラリの cm モジュールの get_cmap() メソッドを使用して、カラーマップにアクセスできます。

get_cmap() メソッドの構文は次のとおりです。

matplotlib.cm.get_cmap(name=None, lut=None)
  1. name パラメータは、カラーマップの名前を文字列または matplotlib.colors モジュールで定義された Colormap オブジェクトとして受け入れます。デフォルト値は None です。パラメータ名に入力を指定しない場合、get_cmap() メソッドは viridis カラーマップを返します。
  2. Matplotlib ライブラリで定義された指定された名前のカラーマップの場合、get_cmap() メソッドは Colormap インスタンスを返します。
  3. パラメータ lut のデフォルト値は None です。lutNone でない場合は、カラーマップの定義に使用されるリスト内の色の数を指定する整数である必要があります。
  4. name が有効なカラーマップではなく、lutNone でない場合、ルックアップテーブルに lut 値を入力するためにカラーマップがリサンプリングされます。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

cm.get_cmap("viridis", 8)

出力:

matplotlib カラーマップ-viridis

上記のコードは、JupyterNotebook のインタラクティブシェルで実行されています。別の IDE で実行しようとすると、上記の画像が出力される場合と得られない場合があります。

get_cmap() メソッドによって返されるカラーマップは呼び出し可能です。0 から 1 までの値をカラーマップオブジェクトに渡すと、RGBA 値が返されます。

この例でこれを観察できます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis(0.56))

出力:

(0.122312, 0.633153, 0.530398, 1.0)

Python で ListedColormap オブジェクトの colors 属性を使用してカスタムリストカラーマップを作成する

カスタムの ListedColormap を作成するには、まず、ListedColormap に色がどのように保存されるかを見てみましょう。このために、ListedColormap オブジェクトの colors 属性を使用できます。

たとえば、viridisListedColormap です。次の例に示すように、viridis カラーマップの colors 属性を使用して色の値を観察できます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis.colors)

出力:

[[0.267004 0.004874 0.329415 1.      ]
 [0.275191 0.194905 0.496005 1.      ]
 [0.212395 0.359683 0.55171  1.      ]
 [0.153364 0.497    0.557724 1.      ]
 [0.122312 0.633153 0.530398 1.      ]
 [0.288921 0.758394 0.428426 1.      ]
 [0.626579 0.854645 0.223353 1.      ]
 [0.993248 0.906157 0.143936 1.      ]]

ここでは、色が Nx4 の配列に格納されていることがわかります。以下に示すように、入力引数として必要なシーケンスを使用してカラーマップ名を呼び出すことにより、ListedColormap の指定された行数にアクセスすることもできます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

viridis = cm.get_cmap("viridis", 8)
print(viridis(range(0, 8)))

出力:

[[0.267004 0.004874 0.329415 1.      ]
 [0.275191 0.194905 0.496005 1.      ]
 [0.212395 0.359683 0.55171  1.      ]
 [0.153364 0.497    0.557724 1.      ]
 [0.122312 0.633153 0.530398 1.      ]
 [0.288921 0.758394 0.428426 1.      ]
 [0.626579 0.854645 0.223353 1.      ]
 [0.993248 0.906157 0.143936 1.      ]]

ご覧のとおり、ListedColormap はリストを使用して表されます。したがって、Python でカスタムの ListedColormap を作成するには、カラーマップの色を表すリストを作成する必要があります。

Python で色名を使用してカスタムリストカラーマップを作成する

ListedColormap() メソッドを使用して、カスタムリストされたカラーマップを作成できます。ListedColormap() メソッドの構文は次のとおりです。

matplotlib.colors.ListedColormap(colors, name="from_list", N=None)
  1. パラメータ colors は、RGBA 値を表す色名または数値の配列またはリストを取ります。
  2. パラメータ name は、作成されたカスタムカラーマップに特定の名前を付けるために使用されます。デフォルト値は from_list です。
  3. パラメータ N は、カラーマップのエントリ数を示します。デフォルト値は None です。N の値が None の場合、colors リストの色ごとに 1つのカラーマップエントリが必要です。

ListedColormap() メソッドと色のリストを使用してカスタムリストされたカラーマップを作成するには、4つの色の名前を ListedColormap() メソッドに渡すことができます。Colormap オブジェクトを返します。

その後、以下に示すように、Colormap オブジェクトを使用してデータをプロットできます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
cmap = ListedColormap(["darkorange", "gold", "lawngreen", "lightseagreen"])
c = np.linspace(0, 150, 12)
plt.scatter(xdata, ydata, c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()

出力:

色名を使用して Python でカスタムリストカラーマップを作成する

Python で RGBA 値を使用してカスタムリストカラーマップを作成する

色名を使用する代わりに、RGBA 値の配列を使用して、以下に示すようにカラーマップを作成できます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
colorarray = [
    [0.57647055, 0.4116, 0.27107143, 1],
    [0, 0.4116, 0.27107143, 1],
    [0.57647055, 0, 0.27107143, 1],
]
cmap = ListedColormap(colorarray)
c = np.linspace(0, 150, 12)
plt.scatter(xdata, ydata, c=c, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()

出力:

RGBA 値を使用して Python でカスタムリストカラーマップを作成する

Python でカスタム線形セグメント化カラーマップを作成する方法は

カスタムの線形セグメント化カラーマップを作成する前に、線形セグメント化カラーマップに色の値がどのように格納されるかを観察してみましょう。

線形セグメント化されたカラーマップには、color 属性がありません。ただし、カラー値を監視するための入力引数として、必要なシーケンスを使用してカラーマップ名を呼び出すことができます。

たとえば、copper カラーマップのカラー値は次のように確認できます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

copper = cm.get_cmap("copper", 8)
print(copper(range(0, 8)))

出力:

[[0.         0.         0.         1.        ]
 [0.17647055 0.1116     0.07107143 1.        ]
 [0.35294109 0.2232     0.14214286 1.        ]
 [0.52941164 0.3348     0.21321429 1.        ]
 [0.70588219 0.4464     0.28428571 1.        ]
 [0.88235273 0.558      0.35535714 1.        ]
 [1.         0.6696     0.42642857 1.        ]
 [1.         0.7812     0.4975     1.        ]]

Python の Matplotlib の cdict とは何ですか

LinearSegmentedColormap クラスは、RGBA 値が補間されて線形セグメント化カラーマップを定義するアンカーポイントを使用します。

  1. すべてのアンカーポイントは、[x[i] yleft[i] yright[i]] の形式の行列の行として指定されます。x[i] はアンカーであり、yleft[i]yright[i] はアンカーポイントの両側の色の値です。
  2. カラーマップのアンカーポイントに不連続性がある場合、yleft[i]yright[i] の値は異なります。それ以外の場合、yleft[i]yright[i] の値は同じです。
  3. アンカーポイントは、cdict と呼ばれることが多いカラー辞書に保存されます。辞書のキーは redgreen、および blue であり、対応する値は、[x[i] yleft[i] yright[i]] の形式の行列の行として指定されたアンカーポイントです。cdict の各エントリで、x[i] の値は 0 から 1 まで単調に増加する必要があります。

カラー辞書は次のように作成できます。

cdict = {
    "blue": [[0.0, 0.0, 0.0], [0.5, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "red": [[0.0, 0.0, 0.0], [0.25, 0.0, 0.0], [0.75, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "green": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [1.0, 1.0, 1.0]],
}

Python でアンカーポイントを使用してカスタム線形セグメント化カラーマップを作成する

cdict を作成した後、LinearSegmentedColormap() メソッドを使用して線形セグメント化カラーマップを作成できます。LinearSegmentedColormap() メソッドの構文は次のとおりです。

matplotlib.colors.LinearSegmentedColormap(name, segmentdata, N=256, gamma=1.0)
  1. name パラメータは、カラーマップの名前を示します。文字列である必要があります。
  2. パラメータ segmentdata は、入力引数として cdict を取ります。
  3. パラメータ N は、カラーマップルックアップテーブル内のポイントの数を示します。デフォルト値は 256 です。
  4. パラメータ gamma は、x 座標に使用されるスケーリングを示します。デフォルト値は 1.0 です。

以下に示すように、LinearSegmentedColormap() メソッドを使用して線形セグメント化カラーマップを作成できます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
cdict = {
    "blue": [[0.0, 0.0, 0.0], [0.5, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "red": [[0.0, 0.0, 0.0], [0.25, 0.0, 0.0], [0.75, 1.0, 1.0], [1.0, 1.0, 1.0]],
    "green": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [1.0, 1.0, 1.0]],
}
newcmp = LinearSegmentedColormap("testCmap", segmentdata=cdict, N=256)
c = np.linspace(0, 80, 12)
plt.scatter(xdata, ydata, c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()

出力:

アンカーポイントを使用して、Python でカスタム線形セグメント化カラーマップを作成します

Python で色名を使用してカスタム線形セグメント化カラーマップを作成する

cdict を使用する代わりに、色のリストを使用してカスタムカラーマップを作成することもできます。このために、LinearSegmentedColormap.from_list() メソッドを使用できます。from_list() メソッドの構文は次のとおりです。

from_list(name, colors, N=256, gamma=1.0)

ここで、パラメータ colors は入力引数として色のリストを取ります。他のすべてのパラメーターは、LinearSegmentedColormap() メソッドに似ています。

次のように、from_list() メソッドを使用して線形セグメント化カラーマップを作成できます。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
import matplotlib.colors

xdata = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
ydata = [x * x for x in xdata]
norm = plt.Normalize(1, 150)
colorlist = ["darkorange", "gold", "lawngreen", "lightseagreen"]
newcmp = LinearSegmentedColormap.from_list("testCmap", colors=colorlist, N=256)
c = np.linspace(0, 80, 12)
plt.scatter(xdata, ydata, c=c, cmap=newcmp, norm=norm)
plt.colorbar()
plt.show()

出力:

色の名前を使用して、Python でカスタム線形セグメント化カラーマップを作成します

まとめ

この記事では、Python で Matplotlib を使用してカスタムカラーマップを作成するさまざまな方法について説明しました。リストされたカラーマップと線形セグメント化されたカラーマップを作成し、カラーマップを使用していくつかのデータをプロットしました。

著者: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

関連記事 - Matplotlib Color