创建具有特定值的白色间隔的正常颜色条

问题描述 投票:0回答:1

我有南极洲周围的海冰浓度数据,范围在 -40 到 +40 之间(参见附图),但我希望 +10 到 -10 之间的值在我的地图和颜色栏中显示为白色,因为它们不代表海冰浓度(在当前图中呈现浅绿色和浅蓝色)。

我不想将它们从我的数组中排除,而是想为它们分配特定的颜色(在本例中为白色)并保留其他值的喷射色阶。

Map of Sea Ice Anomaly

我已经研究了多个其他问题(即如何更改颜色条的颜色(在某些特定值区间)?; 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() 
python matplotlib intervals colorbar
1个回答
3
投票

我假设您已经阅读了链接的问题及其答案。 上面写得很清楚

颜色图始终介于 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() 

© www.soinside.com 2019 - 2024. All rights reserved.