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
相关产品推荐
相关产品推荐

