调整地理绘图的颜色图

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

我使用 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')

我执行标准化,以便用蓝色阴影覆盖负温度,用红色阴影覆盖正温度。如果数据集包含大范围的负温度和正温度,则地理图似乎没问题:

nice color spread 但是如果存在大量正温度和少量稍微负温度,则地图将不会按预期构建wrong color spread 在图像中,您可以看到稍微负的温度(最小值为 272.6236 K)是如何用深蓝色阴影(颜色图的极蓝色值)绘制的,而不是像温度略低于零的浅蓝色。

当我绘制放大到这个负温度区域的地理图时,我还得到了一个具有适当的色调分布的漂亮图像: nice color spread 为什么图2的颜色绘制不正确?我怎样才能避免这种情况?

python matplotlib plot colors cartopy
1个回答
0
投票

这基本上是因为

levels
contourf
参数中的 bin 数量是固定的。

根据documentation,int

levels
通常会在数据最小值和最大值之间生成等距的轮廓线(有时它可能会导致更少的垃圾箱以使颜色条中的分隔值更好。例如,您的第二个示例只有11 个级别,少于您指定的 15 个)。如果您的数据的最大值太大 ($$\T_{max}$$),则低于 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
手动指定级别。

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