如何为Matplotlib的contourf色条添加带阴影填充的额外色块
如何为Matplotlib的contourf色条添加带阴影填充的额外色块
嘿,这个需求我之前也碰到过!其实不用在contourf的句柄上提前折腾,我们可以在色条生成后,直接在色条的轴上“贴”一个带阴影的色块就行,操作起来超简单,我给你一步步讲:
首先先补全你那部分不完整的最小示例代码,先做出基础的绘图效果:
import matplotlib.pyplot as plt import cartopy.crs as ccrs import numpy as np # 生成模拟数据,包含0值区域 lon = np.linspace(-180, 180, 100) lat = np.linspace(-90, 90, 50) lon, lat = np.meshgrid(lon, lat) data = np.cos(np.radians(lat)) * np.sin(np.radians(lon/2)) data[np.abs(data) < 0.2] = 0 # 制造0值区域 # 创建绘图面板 fig, ax = plt.subplots(figsize=(10, 6), subplot_kw={'projection': ccrs.PlateCarree()}) ax.coastlines() # 绘制主contourf contour = ax.contourf(lon, lat, data, levels=np.linspace(-1, 1, 11), cmap='coolwarm', transform=ccrs.PlateCarree()) # 给0值区域添加阴影填充 ax.contourf(lon, lat, np.where(data == 0, 1, np.nan), hatches=['///'], alpha=0, transform=ccrs.PlateCarree()) # 生成色条 cbar = fig.colorbar(contour, ax=ax, shrink=0.8, pad=0.05)
接下来就是关键的一步:给色条左侧添加带阴影的色块。我们可以利用Matplotlib的补丁(Patch)功能,直接在色条的轴上画一个矩形,具体代码加在cbar = fig.colorbar(...)之后:
from matplotlib.patches import Rectangle # 获取色条对应的轴对象 cbar_ax = cbar.ax # 创建带阴影的矩形补丁:用轴坐标系(0-1对应轴的宽高) # 这里x从-0.2到0(在色条左侧占20%的轴宽度),y从0到1(覆盖整个色条高度) hatch_patch = Rectangle((-0.2, 0), width=0.2, height=1, transform=cbar_ax.transAxes, facecolor='white', # 背景色和图中0值区域的填充一致 hatch='///', # 阴影样式和图中对应 edgecolor='black', # 加个黑框对齐色条 clip_on=False) # 允许补丁超出轴的默认边界 # 把补丁添加到色条轴上 cbar_ax.add_patch(hatch_patch) # 调整色条轴的x范围,让左侧的补丁能显示出来 cbar_ax.set_xlim(-0.2, 1) # 最后显示图像 plt.show()
给你划几个重点:
- 用
transform=cbar_ax.transAxes是为了让补丁的位置和尺寸相对色条轴自动适配,不管色条怎么缩放都不会错位 clip_on=False必须加,因为我们的补丁x范围超出了色条轴默认的0-1范围,不加的话会被裁剪掉- 你可以根据自己的需求调整
width=0.2这个值,控制左侧色块的宽度,或者修改hatch的样式(比如改成'xxx'、'+++'都可以)
这样运行之后,就能得到和你用GIMP修出来的一样的效果啦!
备注:内容来源于stack exchange,提问作者EJSABOLK




