我使用 cartopy 绘制了一些地理图。使用两斜率归一化和“RdBu_r”颜色图来绘制气温场。
color_map = 'RdBu_r'
fig = plt.figure(figsize=(16, 12))
ax = plt.axes(projection=prj)
norm = TwoSlopeNorm(vmin=np.min(data), vcenter=273.15, vmax=np.max(data))
filled_contour = ax.contourf(data['longitude'], data['latitude'], data, norm=norm, levels=15, transform=ccrs.PlateCarree(), cmap=color_map, extend='both')
isotherm_0 = ax.contour(data['longitude'], data['latitude'], data, levels=[273.15], colors='green', transform=ccrs.PlateCarree(), linewidths=0.5, linestyles='dashed')
我执行标准化,以便用蓝色阴影覆盖负温度,用红色阴影覆盖正温度。如果数据集包含大范围的负温度和正温度,则地理图似乎没问题:
但是如果存在大量正温度和少量稍微负温度,则地图将不会按预期构建: 在图像中,您可以看到稍微负的温度(最小值为 272.6236 K)是如何用深蓝色阴影(颜色图的极蓝色值)绘制的,而不是像温度略低于零的浅蓝色。
当我绘制放大到这个负温度区域的地理图时,我还得到了一个具有适当的色调分布的漂亮图像: 为什么图2的颜色绘制不正确?我怎样才能避免这种情况?
这基本上是因为
levels
的 contourf
参数中的 bin 数量是固定的。
根据documentation,int
levels
通常会在数据最小值和最大值之间生成等距的轮廓线(有时它可能会导致更少的垃圾箱以使颜色条中的分隔值更好。例如,您的第二个示例只有11 个级别,少于您指定的 15 个)。如果您的数据的最大值太大 (),则低于 273.15 的小值将落入一个 bin,因此只有一种颜色。
一个简单的解决方案是增加级别数量。假设我们想要范围相对较小的一侧至少有 3 种颜色,则设置 `levels=(np.ptp(data)/(np.min((273.15-np.min(data), np.max(data) )-273.15))/3)).astype(int)。但请注意,当最大值或最小值太接近 273.15 时,这可能会导致级别数量过多。
您还可以尝试使用固定数组和固定
TwoSlopeNorm
手动指定级别。