デフォルトの色の変更#
他の場所で詳しく説明されているように [リンクを挿入]jet
は、経験的に悪いカラーマップであり、デフォルトのカラーマップであってはなりません。プロットの外観を変更すると下位互換性が損なわれるという立場のため、この変更は本来よりもはるかに長く延期されてきました。デフォルトのカラーマップを変更することに加えて、プロットのデフォルトのカラーサイクルを変更し、塗りつぶされたプロット ( imshow
、
pcolor
、contourf
など) と散布図のようなプロットに別のカラーマップを採用する機会を利用する予定です。
デフォルトのヒート マップ カラーマップ#
新しいカラーマップの選択は、バイク脱落の肥沃な土壌であるため (「いいえ、_this_ 色にする必要があります」)、提案されたカラーマップを評価するための提案された設定基準があります (Nathaniel Smith 経由)。
データの「中心」がどこにあるかを知らない限り、発散するカラーマップは本当に誤解を招くため、それはシーケンシャルなカラーマップでなければなりません。
つまり、近くの色がどれだけ離れているかについての人間の主観的な判断は、少なくとも局所的には、それらが表す数値の差に可能な限り線形に対応する必要があります。
知覚的に均一な輝度ランプを持つ必要があります。つまり、グレースケールに変換しても均一である必要があります。これは、実用的な観点からも (グレースケール プリンターは今でも使用されています!)、輝度は非常に強力で自然な大きさの手がかりであるため、便利です。
また、色相にも何らかの変化が必要です。色相の変化は知覚にとって非常に役立つ追加の手がかりであり、1 つよりも 2 つの手がかりを持つ方が優れており、そうしない理由はありません。
より一般的なタイプの色盲の視聴者にとっても妥当な結果が得られるように、色相のバリエーションを選択する必要があります。(赤から緑などを除外します。)
ボーナス ポイントとして、輝度の変化を無視しても機能する色相ランプを選択するとよいでしょう。これは、2D プロットでは輝度が変化するバージョンを使用し、3D プロットでは色相変化のみのバージョンを使用できるためです。(3D プロットでは、照明/シェーディング用に輝度チャネルを確保する必要があります。これは、脳が輝度の変化から 3D 形状を抽出するのが非常に得意であるためです。3D サーフェス自体の輝度が大幅に変化している場合、これは形状を見る能力を台無しにします。 )
既存の知的財産権を侵害しない
スクリプト例#
提案されたカラーマップ#
デフォルトの散布カラーマップ#
ヒート マップのようなアプリケーションでは、可能な限り多くの輝度スケールをカバーすることが望ましい場合がありますが、マーカーをカラーマッピングする場合、マーカーが白に近すぎると問題になる可能性があります。そのため、マーカーベースのヒート マップとは異なる (ただし関連する可能性がある) カラーマップを使用することをお勧めします。設計パラメータは上記と同じですが、輝度の変動がより制限されています。
スクリプト例#
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1234)
fig, (ax1, ax2) = plt.subplots(1, 2)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses
ax1.scatter(x, y, s=area, c=colors, alpha=0.5)
X,Y = np.meshgrid(np.arange(0, 2*np.pi, .2),
np.arange(0, 2*np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
Q = ax2.quiver(X, Y, U, V, units='width')
qd = np.random.rand(np.prod(X.shape))
Q.set_array(qd)
提案されたカラーマップ#
カラーサイクル / 定性的なカラーマップ#
線をプロットするとき、区別できるようにする必要がある複数の線またはアーティストをプロットすることが望ましいことがよくありますが、固有の順序はありません。
スクリプト例#
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2)
x = np.linspace(0, 1, 10)
for j in range(10):
ax1.plot(x, x * j)
th = np.linspace(0, 2*np.pi, 1024)
for j in np.linspace(0, np.pi, 10):
ax2.plot(th, np.sin(th + j))
ax2.set_xlim(0, 2*np.pi)