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
相关产品推荐
相关产品推荐

