You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于任意整数标签绘制填充等高线图(contourf)的技术问询

解决二维标签网格的独立等高线填充需求

嘿,我来帮你搞定这个contourf的问题!你的核心需求是让每个标签值都对应独立的填充等高线,对吧?刚好可以通过自定义levels参数来实现,我给你整理了完整的解决方案和代码解释:

核心思路

要让每个标签成为独立的等高线,关键是给每个标签设置专属的区间分界:每个标签n的填充范围是[n-0.5, n+0.5)。这样contourf就能把每个标签对应的区域精准划分出来,用你指定的颜色填充。

完整代码实现

import matplotlib.pyplot as plt
from matplotlib import colors
import numpy as np

# 定义颜色映射,顺序对应标签0到4
cmap = colors.ListedColormap(['red', 'orange', 'yellow', 'green', 'royalblue'])

# 生成示例网格坐标
x = np.linspace(-1.0, 1.0, num=50)
xx, yy = np.meshgrid(x, x)

# 第一个示例数据:下三角区域为标签1,其余为0
z1 = np.tril(np.ones(shape=xx.shape))
# 第二个示例数据:下三角区域为标签3,其余为0
z2 = np.tril(np.ones(shape=xx.shape) + 3)

# 通用函数:根据标签生成等高线分界levels
def get_contour_levels(z):
    # 获取所有唯一标签(自动排序)
    unique_labels = np.unique(z)
    # 生成每个标签的上下分界:开头是最小标签-0.5,结尾是最大标签+0.5
    levels = np.concatenate([unique_labels - 0.5, [unique_labels[-1] + 0.5]])
    return levels

# 为两个数据集生成对应的levels
levels1 = get_contour_levels(z1)
levels2 = get_contour_levels(z2)

print('Labels (left): ', np.unique(z1))
print('Labels (right): ', np.unique(z2))

# 创建子图绘制
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))

# 左图:绘制z1的填充等高线
im1 = axes[0].contourf(xx, yy, z1, levels=levels1, cmap=cmap)
axes[0].set_title('Labels 0 & 1')

# 右图:绘制z2的填充等高线
im2 = axes[1].contourf(xx, yy, z2, levels=levels2, cmap=cmap)
axes[1].set_title('Labels 0 & 3')

# 添加统一的颜色条,标注所有出现的标签
fig.colorbar(im1, ax=axes, ticks=np.unique(np.concatenate([z1, z2])))

plt.tight_layout()
plt.show()

关键细节解释

  • 颜色映射:ListedColormap里的5种颜色依次对应0到4的标签,确保每个标签有专属颜色,不会混淆。
  • levels生成:通过np.unique(z)获取数据中实际出现的标签,然后拼接出每个标签的分界值。比如如果标签是0和1,levels就是[-0.5, 0.5, 1.5],contourf会自动把[-0.5,0.5)区域填充为0的颜色,[0.5,1.5)填充为1的颜色。
  • 通用性:写成函数后,不管你的z里包含哪些标签(比如只出现0、2、4,或者0、1、3),都能自动适配生成正确的levels,不用手动调整。
  • 颜色条优化:统一添加颜色条并指定ticks为所有出现的标签,让读者能清楚对应颜色和标签的关系。

内容的提问来源于stack exchange,提问作者Marius Mosbach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:08:02