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

如何创建循环指定次数后停止的Matplotlib自定义colormap

实现自定义循环切换的Colormap函数

直接上实现代码,搭配详细逻辑说明:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

def create_cyclic_bone_cmap(a, b, n):
    # 计算基础参数
    segment_length = b - a
    total_range = a + 2 * n * segment_length  # 最后一个区间的上限值
    bone_cmap = plt.cm.bone
    bone_rev_cmap = plt.cm.bone_r  # 内置反向bone配色
    
    # 收集所有颜色分段的节点信息
    color_nodes = []
    norm_start = 0.0  # 归一化区间的起始位置(0-1)
    norm_segment = segment_length / (total_range - a)  # 单个分段在归一化区间的占比
    
    for _ in range(n):
        # 添加正向bone分段的颜色节点
        bone_colors = bone_cmap(np.linspace(0, 1, 256))
        norm_end = norm_start + norm_segment
        for j in range(256):
            pos = norm_start + (norm_end - norm_start) * (j / 255)
            color_nodes.append((pos, bone_colors[j]))
        
        norm_start = norm_end
        
        # 添加反向bone分段的颜色节点
        rev_colors = bone_rev_cmap(np.linspace(0, 1, 256))
        norm_end = norm_start + norm_segment
        for j in range(256):
            pos = norm_start + (norm_end - norm_start) * (j / 255)
            color_nodes.append((pos, rev_colors[j]))
        
        norm_start = norm_end
    
    # 强制末尾节点位置为1.0,避免超出范围的数值映射异常
    color_nodes.append((1.0, color_nodes[-1][1]))
    
    # 整理为matplotlib要求的colormap格式
    cmap_dict = {'red': [], 'green': [], 'blue': [], 'alpha': []}
    for pos, color in color_nodes:
        cmap_dict['red'].append((pos, color[0], color[0]))
        cmap_dict['green'].append((pos, color[1], color[1]))
        cmap_dict['blue'].append((pos, color[2], color[2]))
        cmap_dict['alpha'].append((pos, color[3], color[3]))
    
    # 创建并返回自定义colormap
    custom_cmap = LinearSegmentedColormap('cyclic_bone', cmap_dict)
    return custom_cmap, total_range

函数使用说明

参数

  • a:第一个正向bone区间的起始值
  • b:第一个正向bone区间的结束值(同时是反向bone区间的起始值)
  • n:循环次数(每次循环包含「正向bone+反向bone」两个分段)

返回值

  • 自定义的LinearSegmentedColormap对象
  • 最后一个区间的上限值,用于后续处理超出范围的数值

示例测试(对应你给出的a=1、b=5、n=3场景)

# 创建自定义colormap
cmap, max_val = create_cyclic_bone_cmap(1, 5, 3)

# 生成测试数据
data = np.linspace(0, 30, 1000)
# 把超出max_val的数值截断,保证映射到最后一种颜色
norm_data = np.clip(data, 1, max_val)
norm_data = (norm_data - 1) / (max_val - 1)

# 可视化验证
plt.figure(figsize=(10, 2))
plt.imshow([norm_data], cmap=cmap, aspect='auto')
plt.colorbar(ticks=[1,5,9,13,17,21,25,30])
plt.yticks([])
plt.show()

核心逻辑说明

  1. 分段划分:每个循环包含两个长度为b-a的区间,分别对应正向bone和反向bone_r配色
  2. 归一化映射:将用户指定的数值区间[a, total_range]转换为colormap要求的[0,1]区间,每个分段占比均等
  3. 颜色节点拼接:把每个分段的256阶颜色渐变节点按归一化位置依次拼接,确保过渡平滑
  4. 超限处理:通过np.clip将超出total_range的数值限制为total_range,实现“大于最后区间上限的数值映射为最后一种颜色”的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:41:04