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

Matplotlib自定义Colorbar:为不等值区间设置等宽颜色分档

解决Matplotlib自定义Colorbar等宽分档问题

我来帮你搞定这个Colorbar的问题~ 你现在遇到的分档宽度不均的问题,根源就在spacing='proportional'这个参数上,咱们一步步来修正:

问题原因

spacing='proportional'会让Colorbar的每个颜色块宽度和你设定的bounds区间的数值跨度成正比。看你的bounds列表:

bounds= [0.02,0.07,0.28,1.14,4.63,8.60,15.70,28.66,52.39,95.69]

前几个区间的跨度特别小(比如0.02→0.07只有0.05),而最后一个区间52.39→95.69跨度有43.3,这就导致小区间的颜色块被压缩得几乎看不见,完全不符合你的需求。

解决方案

要实现颜色分档宽度相等,同时保持数据对应到你设定的区间,只需要做两个关键调整:

  1. 把spacing='proportional'改成spacing='uniform',强制每个颜色块宽度一致
  2. 简化ColorbarBase的参数,避免重复传递boundaries和ticks(其实只需要用bounds作为边界,ticks用来显示刻度即可)

修改后的完整代码

import matplotlib as mpl
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(12, 6))
fig.subplots_adjust(bottom=0.5)

# 自定义颜色映射(和你原来的一致)
cmap = mpl.colors.ListedColormap([
    (1, 1, 1, 0),
    (237/255, 239/255, 243/255, 1.0),  # whitesmoke
    (172/255, 180/255, 206/255, 1.0),  # mediumslateblue
    (161/255, 215/255, 227/255, 1.0),  # lightskyblue
    (143/255, 200/255, 145/255, 1.0),  # seagreen
    (249/255, 236/255, 51/255, 1.0),   # yellow
    (238/255, 181/255, 9/255, 1.0),    # gold
    (233/255, 135/255, 45/255, 1.0),   # orange
    (223/255, 83/255, 42/255, 1.0),    # darkorange
    (217/255, 38/255, 42/255, 1.0)     # red
])

# 你的区间边界(保持不变)
bounds = [0.02, 0.07, 0.28, 1.14, 4.63, 8.60, 15.70, 28.66, 52.39, 95.69]
ticks = bounds  # 刻度和边界一致

# 用BoundaryNorm绑定区间和颜色映射,确保数据正确对应到区间
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

# 创建等宽的Colorbar,关键是spacing='uniform'
cb2 = mpl.colorbar.ColorbarBase(
    ax,
    cmap=cmap,
    norm=norm,
    boundaries=bounds,  # 用bounds作为边界
    ticks=ticks,        # 显示边界作为刻度
    spacing='uniform',  # 强制每个颜色块宽度相等
    orientation='horizontal'
)

plt.show()

关键说明

  • BoundaryNorm依然在工作:它会把你的数据值正确映射到你设定的bounds区间里,每个区间对应一个颜色,这个逻辑完全保留了
  • spacing='uniform'只是改变了Colorbar的视觉显示宽度,让每个颜色块都一样宽,不管区间的数值跨度多大
  • 现在小区间的颜色块会清晰显示出来,同时数据和区间的映射关系没有改变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:12:32