問題是,通過將最小值和最大值之間的範圍除以相等部分,從顏色地圖中選擇顏色。由於大多數關卡彼此非常接近,因此它們落入相同的範圍,因此具有相同的顏色。
最簡單的解決方案不是使用顏色映射,而是每個級別都從顏色列表中獲取顏色的圖。在這種情況下,您可以將顏色列表直接提供給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()
如果你想使用一個顏色表,而不是,你需要一起提供一個標準化的實例與色彩表。 A 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的建議不同,這個問題主要與數據無關,因爲這些級別是明確指定的。純粹是如何定義要使用的顏色範圍。下面的答案中顯示了兩個選項。事實上,完整的地圖是相同的顏色,然而也會允許更嚴格的水平(範圍從-10到10可能就足夠了)。儘管朱利安在提出這樣的問題時應該給出一個[mcve]是完全正確的(請記住下次要問)。 – ImportanceOfBeingErnest