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

matplotlib contourf绘图levels出现额外步长异常问题求解

异常原因

问题出在三个地方:

  • 代码里提前定义了等高线层级clevs = np.arange(0,7,1),但调用contourf的时候根本没把这个参数传进去,matplotlib会自动根据数据分布算层级间隔,不会严格对齐0到6的整数分界,自然会跑出预期外的额外色阶,也就是你看到的那圈多余粉色。
  • 色条刻度位置算错了:原代码里tick_locs = (np.arange(n_clusters) + 0.5)*(n_clusters-1)/n_clusters 是无意义的缩放,算出来的刻度位置和实际填充区间完全对不上,直接导致色条标签和颜色错位,才会出现色条上标5的是粉色,但5本来该对应棕色的问题。
  • 你用的Accent是离散定性色卡,默认自带8个颜色,没显式指定取色数量和层级数匹配的话,matplotlib会自动多取颜色,进一步放大显示异常。
修复方法

改三个点就行:

  • 把提前定义的clevs传给contourf的levels参数,强制等高线按0-6的整数间隔切分,7个聚类刚好对应7个填充区间:[0,1)、[1,2)……[6,7],从根源上堵死额外色阶生成的可能。
  • 色条刻度直接取每个填充区间的中点就行,步长为1的层级数组,中点就是clevs[:-1] + 0.5,不需要额外搞缩放计算。
  • 显式指定从Accent色卡里取7个离散颜色,和聚类数、层级数完全对齐,避免自动取色偏差。

修正后的代码:

plt.clf()
fig = plt.figure(figsize=(10,8))
ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=100.0, globe=None))
ax.set_extent([96,105,1,8])
ax.gridlines(linewidths=0.01, draw_labels=True, alpha=0.3)
ax.xlocator = mticker.FixedLocator(np.arange(96.,105.,0.5))
ax.ylocator = mticker.FixedLocator(np.arange(1.,8.,0.5))

clevs = np.arange(0,7,1)
cs = ax.contourf(
    coords[0], coords[1], code_recons[0],
    levels=clevs,
    vmin=0, vmax=6,
    cmap=plt.get_cmap("Accent", 7),
    transform=ccrs.PlateCarree()
)
ax.coastlines("50m")

cb = plt.colorbar(cs)
n_clusters = 7
tick_locs = clevs[:-1] + 0.5
cb.set_ticks(tick_locs)
cb.set_ticklabels(np.arange(n_clusters))

plt.show()
效果说明

改完之后不会再出现多余的粉色轮廓,每个聚类对应唯一颜色,色条标签和图中颜色完全匹配,数值5会正确对应棕色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:57:34