2017-08-24 17 views
0

私はPythonのために機能するいくつかのデータプロットと、私の研究に必要なツールの1つを扱っています。色を無視したMatplotlibのカスタム分岐勾配

今私は自分のデータをプロットしたいと思っていましたが、色々なデータを扱うカスタムカラーマップを作成しようとしていましたが、これまでの私のプロットでは、私の低い値のために色が繰り返されています。

ここで生成されたプロット例です: enter image description here

そして、私のカスタムカラーマップと同様に、プロットの両方のためのコード:

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF"] 
diffmap_17_colormap = matplotlib.colors.ListedColormap(diffmap_17) 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
cs = m.contourf(x,y,data,contour_levels,cmap=diffmap_17_colormap) #plot total 

私の目標は、カラーマップを持つことです0点を白にしてから外側に広げます(赤は負、青は正です)。当面は、標準のカラーマップを採用していますが、カスタムのものを使うのが好ましいでしょう。

ご協力いただければ幸いです。ありがとう!

+2

あなたのデータはおそらくあなたが信じているものではありません。 [mcve]がなければ助けが難しいです... – Julien

+2

私は@Julienに同意します。あなたの画像に表示されているものから、見ることが難しいいくつかの極端な値があり、残りのデータはすべて-1と1の間の範囲にあるでしょう。限界を変更しようとしましたか( 'vmin'と' vmax ')。また、データがnetcdfのような標準フォーマットのいずれかである場合、ファイルをすばやく見るのに役立つツールがたくさんあります。例えば、netcdfファイルの場合、データを 'ncview'で事前チェ​​ックしたいのです。 –

+0

@ThomasとJulienのコメントとは異なり、問題は明示的に指定されているため、主にデータに依存しません。これは純粋に、使用する色の範囲を定義する方法の問題です。以下の2つのオプションが私の答えに示されています。しかし、完全なマップが同じ色であるという事実は、より厳しいレベル(-10から10の範囲であれば十分でしょう)でも可能になります。ジュリアンは、このような質問をするときに[mcve]を与えなければならないということを完全に正しいと思っています(次回の質問には覚えておいてください)。 – ImportanceOfBeingErnest

答えて

1

問題は、最小値と最大値の間の範囲を等しい部分に分割することによって色がカラーマップから選択されることです。ほとんどのレベルはお互いに非常に近いので、同じ範囲に入り、同じ色になります。

最も簡単な解決策は、カラーマップを使用するのではなく、各レベルがカラーリストから色を取得するプロットです。この場合、contourfプロットに直接色のリストを提供することができます。

plt.contourf(x,y,data,contour_levels,colors=diffmap_17) 

19レベルであるため、リストには18色が必要になることに注意してください。

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

x, y= np.meshgrid(np.linspace(-3,3), np.linspace(-3,3)) 
r = np.sqrt(x**2+y**2) 
data = np.tan((r*0.7-1.5))*1.3 

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", 
       "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", 
       "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF", "#0000ce"] 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 
        0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
cs = plt.contourf(x,y,data,contour_levels,colors=diffmap_17) 

plt.colorbar(cs) 

plt.show() 

enter image description here

あなたの代わりにカラーマップを使用する場合は、カラーマップと一緒に正規のインスタンスを提供する必要があります。 matplotlib.colors.BoundaryNormは、輪郭プロットのレベルのリストである、それに供給される境界のリストに従って色を選択します。

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

x, y= np.meshgrid(np.linspace(-3,3), np.linspace(-3,3)) 
r = np.sqrt(x**2+y**2) 
data = np.tan((r*0.7-1.5))*1.3 

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", 
       "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", 
       "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF", "#0000ce"] 
diffmap_17_colormap = matplotlib.colors.ListedColormap(diffmap_17) 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 
        0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
norm = matplotlib.colors.BoundaryNorm(contour_levels, diffmap_17_colormap.N) 
cs = plt.contourf(x,y,data,contour_levels,cmap=diffmap_17_colormap, norm=norm) 

plt.colorbar(cs) 

plt.show() 

出力プロットは上記と同じです。

+0

私は、OPが17色のレベルしか持たないのは、色を中心にしたレベルを望んでいるからです。すなわち、実際の輪郭レベルは定義されたレベルとカラーバーのティックとの間になります。 - これは少なくとも私が望むものです。これは非常にしばしば白レベルにとって意味があり、「無視できる」(ゼロに近い)値は傾向を示さないためです。多分OPはそれにコメントすることができます...とにかく私から+1。 –

+0

@Thomas正に、境界を対称的にゼロの周りに置くと、より意味をなさないことがあります。しかし、実際にはデータを解釈する必要があり、その時点で私はすでに負の降水量がどれくらいあるかですでに失われています(降水量より多くの水分が蒸発し、その傾向が現実になる希望)。 – ImportanceOfBeingErnest

+0

OPが示しているのは、異なるプロットです - 2つのモデルは、異なる設定またはおそらく異なるアルゴリズムを使用して降水量を計算します。このようなモデルを開発するときは、このようなことを非常に頻繁に行います。とにかく、そうです、それはこの質問の範囲外です。 –

関連する問題