Matplotlib 3.11.0 拒绝重复色标位置,旧渐变定义怎样保留
LinearSegmentedColormap.from_list 的同位置双颜色在 3.11.0 被严格递增校验拒绝。说明 3.11.2 非递减校验和跳变边界验证。
旧色标在 0.8 处从灰色跳到蓝色,升级 Matplotlib 3.11.0 后,LinearSegmentedColormap.from_list() 报 the values passed in the (value, color) pairs must increase monotonically from 0 to 1。输入可能没有倒序,只是在同一位置写了两个颜色节点。
这种定义利用重复位置表达跳变:先保持一段纯色,再从阈值开始进入渐变。3.11.0 的严格递增检查把相邻差为零也视为非法,旧有写法因此失败。不能只看“monotonically”就把两个相同位置合并,那会改变阈值附近的映射。
保留节点定义,使用包含兼容处理的正式版本
Matplotlib 3.11.2 的正式实现拒绝位置下降,即检查相邻差是否小于零;相邻值相等不再触发该项校验。下列结构表达 0.8 处的灰到蓝跳变:
from matplotlib.colors import LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list(
"threshold_colors",
[
(0.0, "gray"),
(0.8, "gray"),
(0.8, "blue"),
(0.95, "white"),
(1.0, "red"),
],
)
这是色标构造示例,项目原有的归一化、颜色值和查找表长度应按实际定义保留。它不意味着可以接受下降的位置、超出 0 到 1 的位置,或任意非法颜色。
不能更新时,可在项目兼容约束内恢复原先可用的整套绘图环境。不要为了通过输入检查,就随手把第二个 0.8 改成 0.800001:这会把零宽跳变变成一个窄渐变区间,而且偏移大小没有通用的业务依据。
改成 under 颜色需要同时调整归一化
若原定义恰好是阈值以下全为一种颜色,可以考虑使用低于范围的 under 颜色,再为有效区间单独建立渐变。但这要一起重设归一化范围,检查颜色条和缺失值颜色,并且只适用于这种阈值模型。
原模型在中间位置还有其他纯色带时,单个 under 颜色不能表达它们。也不要通过把数据值截断到阈值来替代色标修正,那会修改输入数据,影响后续分析。
跳变点不能只检查一个精确值
色标通过离散查找表和渲染量化工作。即使重复节点能够构造,阈值精确点以及紧邻两侧的颜色仍受查找表分辨率和浮点边界影响,不能承诺任意接近 0.8 的数都被完美分到想象中的一侧。
验收覆盖阈值下方、阈值、上方、普通渐变段以及缺失值,检查真实图和颜色条。在分类判定必须严格区分边界的任务里,应让分类规则显式处理数值,不能让一张渐变图承担精确阈值判断。
保留原色标定义与依赖锁文件,重新生成受影响输出。改变构造器能否接受节点,不等于旧图文件已经被修正,也不应在未复查归一化的情况下交换新旧图片。


