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

在Seaborn热力图的对数定性色条中实现0.5×10ⁿ间隔的颜色划分

实现对数色条在0.5×10ⁿ位置分界的方法

我完全理解你的需求——想要让对数色条的颜色分界恰好落在0.5×10ⁿ的位置,每个数量级被拆分成两个视觉上等长的颜色段。其实通过自定义分界点和BoundaryNorm就能轻松实现,下面是具体步骤和修改后的代码:

核心思路

我们需要手动构建对数空间的分界点数组,让每个数量级(比如10ⁿ到10ⁿ⁺¹)被拆分为[10ⁿ, 5×10ⁿ]和[5×10ⁿ, 10ⁿ⁺¹]两个区间,然后用BoundaryNorm来绑定这些分界点和颜色,这样颜色就会精准对应你想要的区间。

修改后的完整代码

import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import math

# 你的原始数据
data = [[0.0065513626834508175, 0.476779092353869, 0.021513472812344454, 0.37316274465007165, 0.11149228130361034, 0.05917159763313834, 0.07437156031533118, 0.1083790557474745, 0.0733214622394398, 0.17898426430010372], [0.18343815513625047, 0.9005827300017748, 0.629269079761209, 0.16754245678166085, 1.1749571183533365, 1.2228796844181362, 1.6064257028112423, 1.4021540337329765, 0.5813344506127501, 0.47729137146693623], [0.4192872117400517, 0.4414621225498852, 0.10218899585865526, 0.441702840606187, 0.03430531732417843, 0.05917159763313834, 0.3421091774505488, 0.216758111494949, 0.12045668796480033, 0.1416958759042417], [0.032756813417179606, 0.14126787921597278, 0.4141343516377186, 0.09138679460818258, 0.1543739279588273, 0.0657462195923697, 0.11899449650453413, 0.2235318024791601, 0.2435318024791601, 0.10440748750837972], [0.5634171907756903, 0.4591206074518771, 0.6131339751519469, 0.8300967176909628, 1.9125214408233189, 1.2294543063773862, 3.004611036739566, 0.8128429181060683, 0.6337069236409385, 1.1708553956297958], [0.27515723270441295, 0.4414621225498852, 0.1237024686709997, 0.0837712283908196, 0.13722126929673809, 0.039447731755425555, 0.20824036888293998, 0.34545824019507615, 0.04713522572536054, 0.2386456857334575]]
grid = pd.DataFrame(data)

# 计算原始的对数极值
exp_max = math.ceil(math.log10(grid.max().max()))
exp_min = math.floor(math.log10(grid.min().min()))
maxval = 10 ** exp_max
minval = 10 ** exp_min

# 构建自定义分界点:每个数量级拆分为[10^n,5*10^n]和[5*10^n,10^(n+1)]
boundaries = []
current = minval
while current <= maxval:
    boundaries.append(current)
    boundaries.append(current * 5)
    current *= 10
# 确保最后一个分界点不超过maxval,且收尾正确
boundaries = [b for b in boundaries if b <= maxval]
if boundaries[-1] != maxval:
    boundaries.append(maxval)

# 生成对应数量的颜色
n_colors = len(boundaries) - 1
cmap = sns.color_palette('ch:start=2,rot=2,light=0.9,d=0.2', n_colors=n_colors)

# 使用BoundaryNorm绑定分界点和颜色
norm = matplotlib.colors.BoundaryNorm(boundaries, n_colors)

# 绘制热力图
kws = { 
    'data': grid, 
    'cmap': cmap, 
    'square': True, 
    'vmax': maxval, 
    'vmin': minval,
    'linecolor': 'black', 
    'lw': .3, 
    'norm': norm,
    'cbar_kws': {'ticks': boundaries}  # 让色条显示所有分界点刻度
}
sns.heatmap(**kws)
plt.tight_layout()
plt.show()

关键细节说明

  • 分界点构建:通过循环生成10ⁿ和5×10ⁿ交替的分界点,确保每个数量级被均匀拆分。
  • BoundaryNorm:替代原来的LogNorm,它能严格按照我们定义的分界点来分配颜色,完美匹配你的需求。
  • 色条刻度:通过cbar_kws={'ticks': boundaries}让色条显示所有分界点,直观看到颜色对应的数值区间。

这样修改后,颜色的分界点就会恰好落在你想要的0.5×10ⁿ位置,同时色条的分辨率也提升了一倍,完全符合你的理想效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:12:45