2017-12-07 6 views
2

のは、私はこのようなデータを持っているとしましょう:カスタマイズされたカラーマップを作成し、さまざまなデータ範囲で使用する方法は?

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.colors 

# for reproducibility purposes 
np.random.seed(0) 

# generate some data 
n = 30 
x = np.array(range(n)) 

a1 = np.random.rand(n) 
a2 = a1 * 100 

と私は

enter image description hereを与える(this answerの変化)

cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", [(0., '#9696ff'), (0.2, '#f0ffff'), (1.0, '#ff0000')]) 

fig, (ax1, ax2) = plt.subplots(1, 2) 
ax1.scatter(x, a1, c=a1, cmap=cmap) 
ax2.scatter(x, a2, c=a2, cmap=cmap) 
plt.show() 

を行うことができ、2つのサブプロットにこれらのデータをプロットしたいです

私の問題は、これらのデータが同じであるように見えますが、右は100倍大きい。

私は両方のプロットに使用できるカラーマップを用意したいと思います。上記と同じコマンドを使用して(代わりに

matplotlib.colors.LinearSegmentedColormap.from_list("", [(0., '#9696ff'), (0.2, '#f0ffff'), (1.0, '#ff0000')]) 

の私は

min_a1_a2 = min(min(a1), min(a2)) 
max_a1_a2 = max(max(a1), max(a2)) 
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", [(min_a1_a2, '#9696ff'), ((min_a1_a2 + max_a1_a2)/2., '#f0ffff'), (max_a1_a2, '#ff0000')]) 

のようなものを使用したいと思いますが、これは常に私がscatterに渡すエラー

ValueError: data mapping points must start with x=0. and end with x=1

になり)。

任意の(値、色)タプルからmatplotlib.colors.LinearSegmentedColormap.from_listに渡す方法はありますか。 scatterもしそうなら、どのようにこれを行うでしょうか?

答えて

2

matplotlibカラーマップは、0と1の間の数値範囲を色の範囲にマッピングします。

データが[0,1]以外の区間(ほとんどの場合はもちろん)の範囲にある場合、最初にその区間を正規化します。この正規化は、使用中のScalarMappable(この場合は散布図など)によって内部的に行われます。

2つの異なるプロットがカラーコードを共有する必要がある場合など、カスタム正規化が必要な場合は、ScalarMappableを作成するときにこれを指定できます。

もそのvminvmax

plt.scatter(x,y, c=c, cmap=cmap, vmin=0, vmax=100) 

または正規インスタンスを介し

plt.scatter(x,y, c=c, cmap=cmap, norm=plt.Normalize(0,100)) 
+0

を使用して、ちょうど 'ax1.scatter(X、A 1、C = A1、CMAP = CMAP、VMIN = min_a1_a2 、vmax = max_a1_a2) '(a2のアナログ)?プロットは今、大丈夫です...それは簡単でした、ありがとう! – Cleb

関連する問題