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

Matplotlib连续/离散颜色映射传入(0,1)外值的返回结果探究

Matplotlib颜色映射超出范围值的处理逻辑

一、连续颜色映射(如viridis)

常规用法是传入0到1之间的数值调用cm(val),但默认情况下,当传入(0,1)范围外的值时,matplotlib不会自动截断到边界值,而是会对颜色渐变趋势进行外推,导致返回的颜色和val=1(或val=0)的颜色有细微差异,示例如下:

import matplotlib.pyplot as plt

viridis = plt.get_cmap("viridis")

print(viridis(1))
# 输出:(np.float64(0.26851), np.float64(0.009605), np.float64(0.335427), np.float64(1.0))

print(viridis(2))
# 输出:(np.float64(0.269944), np.float64(0.014625), np.float64(0.341379), np.float64(1.0))

print(viridis(3))
# 输出:(np.float64(0.271305), np.float64(0.019942), np.float64(0.347269), np.float64(1.0))

如果需要让超出范围的值固定取边界颜色,可以通过两种方式实现:

  • 调用cmap.set_over(color)和cmap.set_under(color)设置超出上/下界时的颜色,配合Normalize类使用
  • 手动截断输入值,比如用np.clip(val, 0, 1)将值限制在0-1范围内后再传入颜色映射

二、离散颜色映射(如tab10)

离散颜色映射的常规处理逻辑是:传入[0,1]内的浮点数时,会通过int(val * cm.N)计算颜色索引(cm.N是该映射包含的离散颜色总数,tab10的N为10)。

当传入超出[0,1]范围的浮点数时,matplotlib会先对输入值做取模运算(对1取模),再按照上述规则转换为颜色索引。示例验证:

import matplotlib.pyplot as plt

tab10 = plt.get_cmap("tab10")
print(tab10(1.2))  # 等价于tab10(0.2),对应索引为2的颜色
print(tab10(-0.3)) # 等价于tab10(0.7),对应索引为7的颜色

内容的提问来源于stack exchange,提问作者P. Camilleri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:22:39