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

如何为带类别标签的2D网格配置contourf层级与固定标签颜色?

解决contourf的levels设置与固定标签颜色问题

我来帮你搞定这几个问题——让contourf呈现出和pcolormesh一致的色块效果,同时给每个标签绑定固定颜色,还能解决边界多余等高线的问题。

一、正确设置levels参数,匹配离散标签

你的问题核心在于contourf默认会自动生成连续的levels,而你的标签是离散整数,所以会出现多余的过渡区域和等高线。要让contourf和pcolormesh效果一致,需要把levels设置在每两个相邻标签的中间位置,这样每个区间刚好对应一个标签值。

比如你的标签范围是0-5,那levels应该设为:

levels = np.arange(-0.5, 6, 1)  # 生成[-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5]

这样每个网格的z值(整数)会刚好落在对应的区间里,contourf就会给每个网格块填充单一颜色,不会产生中间过渡的等高线,完美匹配pcolormesh的效果。

二、固定每个标签的颜色

要给特定标签绑定固定颜色,你需要自定义一个离散颜色映射(ListedColormap),把每个标签索引对应到你想要的颜色上。比如你想让标签4显示为红色,其他标签可以自己指定颜色:

from matplotlib.colors import ListedColormap

# 自定义颜色列表,索引对应标签0-5
custom_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#9467bd', '#ff0000', '#8c564b']
cmap = ListedColormap(custom_colors)

这里索引4对应的就是红色(#ff0000),这样标签4的区域就会始终显示红色。

三、整合代码解决所有问题

把上面的设置整合到你的代码里,就能得到符合预期的效果:

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

np.random.seed(1234)
x = np.linspace(-1.0, 1.0, num=5)
xx, yy = np.meshgrid(x, x)
z = np.random.randint(low=0, high=6, size=xx.shape)

# 设置正确的levels:在标签中间分隔
levels = np.arange(-0.5, 6, 1)
# 自定义颜色映射,标签4对应红色
custom_colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#9467bd', '#ff0000', '#8c564b']
cmap = ListedColormap(custom_colors)

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10,8))

# 带正确levels和自定义颜色的contourf
cf = axes[0, 0].contourf(xx, yy, z, levels=levels, cmap=cmap)
# 叠加黑色等高线,分隔不同标签区域
axes[0, 1].contour(xx, yy, z, levels=levels, colors='k')
# 散点图对比
axes[1, 0].scatter(xx, yy, marker='.', c=z, cmap=cmap, s=100)
# pcolormesh对比
axes[1, 1].pcolormesh(xx, yy, z, cmap=cmap)

# 添加颜色条,对应标签
fig.colorbar(cf, ax=axes, ticks=np.arange(0,6), label='标签值')
plt.tight_layout()
plt.show()

这样修改后:

  • contourf会和pcolormesh一样,每个网格块对应单一标签颜色
  • 标签4的区域始终显示红色
  • 边界处只会出现一条分隔不同标签的等高线,不会有多余的过渡线

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

火山引擎 最新活动