我正在使用 matplotlib、xarray 和 cartopy 绘制一些数据的轮廓图。使用 ax.contourf 实例绘制数据轮廓图,生成下图中的颜色条。然后我屏蔽数组并填充所有等于零的值。
我想在颜色条的左侧添加一个额外的条,就像我在 GIMP 中构建的那样
我想象这会在 fig.colorbar() 调用之前执行,对原始 contourf 句柄进行操作,但无法弄清楚如何做到这一点。
谢谢任何建议。
最小样本如下,产生下图:
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import numpy as np
fig = plt.figure()
ax = plt.axes(projection = ccrs.Mollweide(central_longitude=96))
ax.coastlines()
X = np.arange(-180,180,1)
Y = np.arange(-90,91,1)
X_grid, Y_grid = np.meshgrid(X,Y)
Z = np.random.random_sample((len(Y),len(X))).round(1)
Z.sort()
levels = [0,0.05,0.25,0.5,0.75,0.85,1]
CS = ax.contourf(X_grid,Y_grid,Z,transform = ccrs.PlateCarree(), cmap='plasma', transform_first=True, levels=levels)
HS = ax.contourf(X_grid,Y_grid,np.ma.masked_not_equal(Z,0),transform=ccrs.PlateCarree(),colors='none', levels=[-0.01,0.01],hatches=['X','X'], transform_first=True)
cbar = fig.colorbar(CS, orientation='horizontal', aspect=40, location='top')
编辑:有一种解决方案我不喜欢,因为它不够稳健,即独立于颜色条定义阴影矩形,缩小颜色条,明确定义矩形补丁锚点和大小,然后将矩形添加到图中。我在以下代码片段中完成了此操作,生成了以下图像(请忽略我还对颜色条的比例或相对于颜色条的刻度位置进行了更改):
import matplotlib.patches as mpatches
hrect = mpatches.Rectangle((.0.9185, 0.8998), 0.057, 0.0395, ec='k',hatch='XXX', transform=fig.transFigure, figure=fig, fill=False)
fig.patches.extend([hrect])
这不是一个令人满意的答案,因为如果图形大小发生变化、地理轴发生变化等,矩形位置将相对于颜色条位置而变化。理想情况下,这个矩形将粘在颜色条对象的末尾,但这似乎是不可能的。在进行更改时,至少让所有内容保持一致的一种方法是使用 gridspec 定义特定的颜色条轴,然后在与 cax 相邻的单独 gridspec 子图中绘制矩形。同样,这并不优雅。
下面的方法添加了一个额外的级别来为阴影区域创建一个框。
从最初使用的颜色中创建一个颜色列表,并扩展第一个区域的颜色。在示例代码中,使用白色为其着色,但您也可以使用与第一个区域相同的颜色。
颜色列表用于创建
ListedColormap
(没有颜色图,则没有颜色图的信息)。创建等高线图和颜色条后,在第一个颜色条区域顶部绘制一个具有相同填充图案的透明矩形。
如果阴影区域的表面颜色与第一个区域相同,则看起来会是这样的: