Python Matplotlib を使用したカスタムカラーマップ
- Python Matplotlib を使用してカスタムカラーマップを作成する
-
Python Matplotlib の
get_cmap()
メソッドを使用してカラーマップとその値にアクセスする -
Python で
ListedColormap
オブジェクトのcolors
属性を使用してカスタムリストカラーマップを作成する - Python でカスタム線形セグメント化カラーマップを作成する方法は
- まとめ
カラーマップは、グラフの連続値と離散値の間の変動を示すための最も効果的な方法の 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)
name
パラメータは、カラーマップの名前を文字列またはmatplotlib.colors
モジュールで定義されたColormap
オブジェクトとして受け入れます。デフォルト値はNone
です。パラメータ名に入力を指定しない場合、get_cmap()
メソッドはviridis
カラーマップを返します。- Matplotlib ライブラリで定義された指定された名前のカラーマップの場合、
get_cmap()
メソッドはColormap
インスタンスを返します。 - パラメータ
lut
のデフォルト値はNone
です。lut
がNone
でない場合は、カラーマップの定義に使用されるリスト内の色の数を指定する整数である必要があります。 name
が有効なカラーマップではなく、lut
がNone
でない場合、ルックアップテーブルに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)
出力:
上記のコードは、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
属性を使用できます。
たとえば、viridis
は ListedColormap
です。次の例に示すように、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)
- パラメータ
colors
は、RGBA 値を表す色名または数値の配列またはリストを取ります。 - パラメータ
name
は、作成されたカスタムカラーマップに特定の名前を付けるために使用されます。デフォルト値はfrom_list
です。 - パラメータ 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 で 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()
出力:
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 値が補間されて線形セグメント化カラーマップを定義するアンカーポイントを使用します。
- すべてのアンカーポイントは、
[x[i] yleft[i] yright[i]]
の形式の行列の行として指定されます。x[i]
はアンカーであり、yleft[i]
とyright[i]
はアンカーポイントの両側の色の値です。 - カラーマップのアンカーポイントに不連続性がある場合、
yleft[i]
とyright[i]
の値は異なります。それ以外の場合、yleft[i]
とyright[i]
の値は同じです。 - アンカーポイントは、
cdict
と呼ばれることが多いカラー辞書に保存されます。辞書のキーはred
、green
、および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)
name
パラメータは、カラーマップの名前を示します。文字列である必要があります。- パラメータ
segmentdata
は、入力引数としてcdict
を取ります。 - パラメータ N は、カラーマップルックアップテーブル内のポイントの数を示します。デフォルト値は 256 です。
- パラメータ
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 で色名を使用してカスタム線形セグメント化カラーマップを作成する
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 で Matplotlib を使用してカスタムカラーマップを作成するさまざまな方法について説明しました。リストされたカラーマップと線形セグメント化されたカラーマップを作成し、カラーマップを使用していくつかのデータをプロットしました。
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