基于任意整数标签绘制填充等高线图(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
相关产品推荐
相关产品推荐

