我有南极洲周围的海冰浓度数据,范围在 -40 到 +40 之间(参见附图),但我希望 +10 到 -10 之间的值在我的地图和颜色栏中显示为白色,因为它们不代表海冰浓度(在当前图中呈现浅绿色和浅蓝色)。
我不想将它们从我的数组中排除,而是想为它们分配特定的颜色(在本例中为白色)并保留其他值的喷射色阶。
我已经研究了多个其他问题(即如何更改颜色条的颜色(在某些特定值区间)?; Python matplotlib 更改超出颜色条范围的值的默认颜色; **使用 ' 后重置默认 matplotlib 颜色图值set_under' 或 'set_over')
但还没有设法将这些应用到我的案例中。
我尝试过使用“set under”、“set over”、“set.bad”,但没有得到我想要的。我也尝试过创建自己的色彩图,但也没有成功。
有人可以帮忙吗?
谢谢。
更新:
我已经改编了“stackoverflow.com/a/41815114/5103802”中的代码(请参阅下面的更新代码),但我的颜色对于值 [+10 -10] 和“jet”来说不是白色的 高于 +10 和低于 -10(见下图)。 “tmap”对象似乎弄乱了色阶。关于如何获得喷射色阶并保留 -10 和 +10 白色之间的间隔有什么想法吗?
感谢您的帮助。
更新代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
from mpl_toolkits.basemap import Basemap, cm, rcParams
HIGH_86 = a.variables['high_86'][:]
n=40
x = 10
lower = plt.cm.seismic(np.linspace(1-x, 0, n))
upper = plt.cm.seismic(np.linspace(0, x, n))
white1 = plt.cm.seismic(np.ones(10)*x)
white2 = plt.cm.seismic(np.ones(10)*-(x))
colors = np.vstack((lower, white1, white2, upper))
tmap = matplotlib.colors.LinearSegmentedColormap.from_list('terrain_map_white', colors)
x = HIGH_86
lats = a.variables['latitude'][:]
lons = a.variables['longitude'][:]
lons, lats = np.meshgrid(lons,lats)
fig, ax = plt.subplots()
m2 = Basemap(projection='spstere',boundinglat=-50,lon_0=180,resolution='l')
CS2 = m2.contourf(lons,lats,x,cmap=tmap,latlon=True)
cbar = m2.colorbar(CS2,location='right', pad="12%")
m2.drawparallels(np.arange(-90.,99.,60.),labels=[False,False,False,False])
m2.drawmeridians(np.arange(-180.,180.,90.),labels=[True,False,False,True])
m2.drawcoastlines()
m1.fillcontinents(color='grey')
plt.title('SIE Anomaly')
plt.show()
我假设您已经阅读了链接的问题及其答案。 上面写得很清楚
颜色图始终介于 0 和 1 之间。
并进一步解释如何获得合适的色彩图。因此,向颜色图提供 10 或 -9 的值是没有意义的。
虽然您可以直接从此处的答案复制代码并会收到不错的结果,但您当然也可以对其进行改进以匹配这种特定情况,其中可以选择 80 种颜色,其中 30 种颜色来自颜色图的下部,30 种来自颜色图的下部从上面开始,中间剩下20个是白色的。
n=30
x = 0.5
lower = plt.cm.seismic(np.linspace(0, x, n))
white = plt.cm.seismic(np.ones(80-2*n)*x)
upper = plt.cm.seismic(np.linspace(1-x, 1, n))
colors = np.vstack((lower, white, upper))
tmap = matplotlib.colors.LinearSegmentedColormap.from_list('map_white', colors)
为了获得没有白色的jet颜色图,可以在中间使用一个数组
n=30
x = 0.5
cmap = plt.cm.jet
lower = cmap(np.linspace(0, x, n))
white = np.ones((80-2*n,4))
upper = cmap(np.linspace(1-x, 1, n))
colors = np.vstack((lower, white, upper))
tmap = matplotlib.colors.LinearSegmentedColormap.from_list('map_white', colors)
重现上图的完整代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
n=30
x = 0.5
cmap = plt.cm.jet
lower = cmap(np.linspace(0, x, n))
white = np.ones((80-2*n,4))
upper = cmap(np.linspace(1-x, 1, n))
colors = np.vstack((lower, white, upper))
tmap = matplotlib.colors.LinearSegmentedColormap.from_list('map_white', colors)
x = np.linspace(0,10)
X,Y = np.meshgrid(x,x)
z = np.sin(X) * np.cos(Y*0.4)*40
fig, ax = plt.subplots()
im = ax.contourf(z, cmap=tmap, vmin=-40, vmax=40)
plt.colorbar(im)
plt.show()