我正在尝试创建一个具有 13 个级别的颜色条,并使用中心值间隔为 0 的发散 RdBu_r 颜色图。目前,我有 an evenly spaced colorbar with values descending by 8 ranging from -48 to +48
我想做的是一个颜色间距均匀但值间距不均匀的颜色条,like this colorbar which I modified in photoshop, such that the values go from [-96.0, -72, -48, -24, -12, -6, 0, 6, 12, 24, 48, 72, 96]
我当前的尝试如下所示:
from cartopy import crs as ccrs; import matplotlib.pyplot as plt
crs_new = ccrs.PlateCarree()
fig, axs = plt.subplots(subplot_kw={'projection': crs_new},figsize=(8, 6))
cmap = 'RdBu_r'
uneven_levels = [-96.0, -72, -48, -24, -12, -6, 0, 6, 12, 24, 48, 72, 96]
vmin,vmax = -48,48
cs=plt.pcolormesh(lon,lat, data,cmap=cmap, transform=crs_new,vmin=vmin,vmax=vmax)
cbar=plt.colorbar(cs,boundaries= uneven_levels)
Which results in a colorbar with really dark ends and clearly uses linearly spaced coloring.
使用 countourf 和“间距=统一”不起作用。
使用“colors.DivergingNorm(vmin=vmin, vcenter=0, vmax=vmax)”不起作用。
我尝试用
定义我自己的颜色条cmap = plt.get_cmap('RdBu_r')
colors = cmap(np.linspace(0, 1, len(uneven_levels)))
但不知道如何让数据与这些级别相匹配,结果与图 3 相同,所以这也不起作用。
非常感谢任何帮助! :)
最佳答案
存在大量深色的原因是 vmin, vmax = -48, 48
,它强制 -48
以下的所有值变为最深的蓝色,并且所有值高于 48
至最深的红色。
要获得与contourf
类似的效果,matplotlib的from_levels_and_colors
可能会有帮助。这会生成一个包含 12 种颜色和一个范数的颜色图。标准是一个函数,它将 -96 到 96 之间的值转换为颜色图的值(由级别定义)。
这里是一些示例代码:
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
import matplotlib.colors as mcolors
x = np.linspace(0, 3 * np.pi, 500)
data = np.sin(x - x[:, np.newaxis] * 2) * 95
uneven_levels = [-96, -72, -48, -24, -12, -6, 0, 6, 12, 24, 48, 72, 96]
cmap_rb = plt.get_cmap('RdBu_r')
colors = cmap_rb(np.linspace(0, 1, len(uneven_levels) - 1))
cmap, norm = mcolors.from_levels_and_colors(uneven_levels, colors)
fig, axs = plt.subplots(ncols=2, figsize=(8, 6))
v = np.linspace(-96, 96, 1000)
axs[0].plot(v, norm(v))
cs = axs[1].pcolormesh(data, cmap=cmap, norm=norm)
cbar = fig.colorbar(cs, ticks=uneven_levels)
plt.show()
左图显示了边界范数如何以非线性方式将 -96 和 96 之间的值映射到各自的颜色。右侧图像显示带有边界的颜色条。
关于python - 具有均匀间隔颜色的颜色条的不均匀(不规则)间隔数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61897393/