You need to enable JavaScript to run this app. 如何用Seaborn heatmap实现低于1000阈值显示黑色的自定义colormap
优惠活动
大模型
产品
解决方案
定价
更多

如何用Seaborn heatmap实现低于1000阈值显示黑色的自定义colormap

实现低于阈值全黑的热力图自定义配色

核心问题说明

seaborn.heatmap的center参数仅用于让发散色标围绕指定值做对称分布,无法实现低于某一数值区域固定显示为黑色的效果,因此此前的配置不满足预期。

实现流程

  • 引入色图构建所需的模块
from matplotlib.colors import LinearSegmentedColormap
  • 构建带黑色阈值的自定义配色:
    • 将0~1000 m/year的数值区间全部映射为纯黑色
    • 1000~4000 m/year区间匹配示例图从深蓝经青、黄到红的渐变效果
    • 色彩映射逻辑:将04000的数值范围归一化到色图的01坐标区间,其中00.25的归一化坐标段(对应原始值01000)固定绑定纯黑色,剩余0.25~1的坐标段填充自然渐变色
  • 两种可选的色图构建方式:
    1. 手动指定色彩节点(可灵活调整渐变细节)
    # 定义每个归一化坐标点对应的色彩值
    color_nodes = [
        (0.0,  (0, 0, 0)),    # 对应原始值0,纯黑
        (0.25, (0, 0, 0)),    # 对应原始值1000,纯黑
        (0.4,  (0, 0, 1)),    # 对应原始值1600,深蓝
        (0.6,  (0, 1, 1)),    # 对应原始值2400,青色
        (0.8,  (1, 1, 0)),    # 对应原始值3200,明黄
        (1.0,  (1, 0, 0))     # 对应原始值4000,纯红
    ]
    custom_cmap = LinearSegmentedColormap.from_list(
        name="threshold_cmap",
        colors=color_nodes
    )
    
    1. 复用matplotlib自带成熟色图(实现简单,色彩过渡更自然)
    # 提取自带turbo色图的全部色彩节点
    base_cmap = plt.get_cmap("turbo")
    cmap_colors = base_cmap(range(base_cmap.N))
    # 将前25%的色彩节点(对应0~1000的数值段)全部替换为纯黑
    cmap_colors[:int(base_cmap.N * 0.25)] = (0, 0, 0, 1)
    custom_cmap = LinearSegmentedColormap.from_list("threshold_turbo", cmap_colors)
    
  • 调用热图接口时传入自定义色图,保持原有vmin/vmax配置不变
df_velocity = df_velocity.sort_index()
df_velocity2 = df_velocity.fillna(0)  # 原有空值补0逻辑保持不变

plt.figure(figsize=(15,15))
ax = sns.heatmap(
    df_velocity2,
    vmin=0,
    vmax=4000,
    cmap=custom_cmap  # 将默认色图替换为自定义的阈值色图
)
plt.show()

适配说明

  • 由于空值已被替换为0,会自然落入0~1000的黑色阈值区间,不需要额外添加掩膜处理
  • 最终生成的色标从纯黑(对应0值)连续过渡到纯红(对应4000值),与示例图的视觉效果完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 22:15:03