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

Matplotlib imshow自定义色彩映射实现(含自定义映射与缩放)

别担心,刚上手Matplotlib碰到这种自定义增强效果的需求确实容易卡壳,我来一步步帮你搞定这个带自定义色彩映射和非线性缩放的imshow绘制!

实现自定义色彩映射与非线性缩放的imshow绘制

1. 从十六进制颜色列表创建自定义色彩映射

Matplotlib提供了两种简单的方式来实现自定义配色:

  • 如果你想要固定的离散颜色块,用ListedColormap最直接,完全复用你提供的十六进制颜色列表:
    import matplotlib.pyplot as plt
    from matplotlib.colors import ListedColormap
    import numpy as np
    
    # 替换成你的十六进制颜色列表
    hex_colors = ["#002B5B", "#256D85", "#8FE3CF", "#F9F5EB"]
    custom_cmap = ListedColormap(hex_colors, name="my_custom_cmap")
    
  • 如果想要颜色之间过渡更平滑,可以用LinearSegmentedColormap.from_list自动插值生成渐变色彩:
    from matplotlib.colors import LinearSegmentedColormap
    
    custom_smooth_cmap = LinearSegmentedColormap.from_list(
        "my_smooth_cmap", hex_colors, N=256  # N控制渐变的精细度
    )
    

2. 实现自定义非线性数据缩放

针对非线性的数值映射,分两种场景处理:

场景一:自定义连续非线性映射

如果你的缩放是一个特定的非线性函数(比如平方根、指数变换),可以自定义一个归一化类:

from matplotlib.colors import Normalize

class CustomNonLinearNorm(Normalize):
    def __call__(self, value, clip=None):
        # 这里替换成你的非线性逻辑,示例为平方根缩放
        # 先把数据缩到[0,1]区间,再做非线性变换
        normalized = (value - self.vmin) / (self.vmax - self.vmin)
        transformed = np.sqrt(normalized)
        return np.ma.masked_array(transformed)

# 初始化时传入你的数据范围
norm = CustomNonLinearNorm(vmin=0, vmax=100)

场景二:分段非线性映射(固定边界)

如果你的缩放是基于几个非线性间隔的分段边界,用BoundaryNorm更合适:

from matplotlib.colors import BoundaryNorm

# 自定义非线性边界,比如间隔越来越大的分段
boundaries = [0, 10, 30, 60, 100]
# 边界数量要比颜色数多1,对应每个区间的颜色
norm = BoundaryNorm(boundaries, ncolors=len(hex_colors))

3. 结合两者绘制imshow

把自定义的色彩映射和归一化规则传入imshow,就能得到你想要的增强效果了,这里用随机数据做示例:

# 生成测试数据(替换成你的真实数据)
data = np.random.randint(0, 100, size=(50, 50))

# 创建绘图
fig, ax = plt.subplots(figsize=(8,6))
im = ax.imshow(data, cmap=custom_cmap, norm=norm)

# 添加颜色条,直观展示颜色与数值的对应关系
plt.colorbar(im, ax=ax, ticks=boundaries if 'boundaries' in locals() else None)

plt.title("自定义色彩映射+非线性缩放效果")
plt.show()

额外实用提示

  • 如果你的非线性缩放是常见类型(幂次、对数),可以直接用Matplotlib内置的归一化类,不用自己写:
    from matplotlib.colors import PowerNorm, SymLogNorm
    # 幂次缩放,gamma=0.5等价于平方根变换
    norm = PowerNorm(gamma=0.5, vmin=0, vmax=100)
    
  • 调试时可以先打印归一化后的数据,确认映射逻辑符合预期,避免颜色显示异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:39:56