You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为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

火山引擎 最新活动