問題は、最小値と最大値の間の範囲を等しい部分に分割することによって色がカラーマップから選択されることです。ほとんどのレベルはお互いに非常に近いので、同じ範囲に入り、同じ色になります。
最も簡単な解決策は、カラーマップを使用するのではなく、各レベルがカラーリストから色を取得するプロットです。この場合、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()
あなたの代わりにカラーマップを使用する場合は、カラーマップと一緒に正規のインスタンスを提供する必要があります。 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()
出力プロットは上記と同じです。
あなたのデータはおそらくあなたが信じているものではありません。 [mcve]がなければ助けが難しいです... – Julien
私は@Julienに同意します。あなたの画像に表示されているものから、見ることが難しいいくつかの極端な値があり、残りのデータはすべて-1と1の間の範囲にあるでしょう。限界を変更しようとしましたか( 'vmin'と' vmax ')。また、データがnetcdfのような標準フォーマットのいずれかである場合、ファイルをすばやく見るのに役立つツールがたくさんあります。例えば、netcdfファイルの場合、データを 'ncview'で事前チェックしたいのです。 –
@ThomasとJulienのコメントとは異なり、問題は明示的に指定されているため、主にデータに依存しません。これは純粋に、使用する色の範囲を定義する方法の問題です。以下の2つのオプションが私の答えに示されています。しかし、完全なマップが同じ色であるという事実は、より厳しいレベル(-10から10の範囲であれば十分でしょう)でも可能になります。ジュリアンは、このような質問をするときに[mcve]を与えなければならないということを完全に正しいと思っています(次回の質問には覚えておいてください)。 – ImportanceOfBeingErnest