2026-10-05
热力图里的零值怎么显示:别把缺失和真实零混在一起
guides
热力表里,颜色一旦承担读数任务,状态边界就不能含糊。0 是数值,空白表示没有填入数值,文本则可能根本不是可参与映射的数字。若在着色前把它们压成同一种状态,读者看到的就不再是原表。讨论数据分布时,应先辨认每个单元格属于哪种状态,再判断它对应哪一档颜色。
0、空值和文本要先分开
所谓“0、空值和文本是三件事”,不是要求它们必须使用不同外观,而是要求它们在进入色阶前分别判定。真实的 0 按数值读取;空白按没有值读取;不匹配数字格式的文本按缺失读取。文本可以归入缺失样式,但不能因此被说成 0。外观可以合并,数值身份不能合并。
顺序色阶只负责表达数值之间的有序差异,不负责替没有数值的状态寻找一种“看起来合适”的颜色。若把文本和空白塞进数值集合,读者不仅无法确认数据是否存在,也难以判断文本被当成了什么。输入状态应在映射前明确,色阶只接收真正参与映射的数值。
缺失不能借用零的颜色
如果先把空白补成 0,再把这个 0 送进颜色映射,空白就会拿到一个看似正常的色阶颜色。只要 0 位于当前表值域的端点,空白就会被染成最深或最浅的颜色;即使 0 位于值域内部,它也会被染成其中一档。问题不只是视觉是否整齐,而是“没有数据”已经被改写成“观测到了 0”。
反过来,把所有 0 一律排除,也会造成另一种损失:真实零会从矩阵中的数值位置消失,并被显示成缺失。真实零与没有记录不是同一件事,前者不该因为数值大小而被抹掉。缺失与零的判断必须分别进行,不能用一个错误修正另一个错误。
缺失的显示口径应当是“不参与映射”,并配有可区分的呈现方式。Matplotlib 官方文档对 Normalize 的说明,针对的是给定区间内的数值映射;imshow 文档又单列 masked values。没有进入映射的值,不应因为渲染器需要返回某种颜色,就伪装成有效数值。
本站怎样区分这些状态
relitu.cn 在输入层先保留原始状态。第一行为列名、第一列为行名,其余单元格填数字;留空表示缺失。空白单元格以及 NA / N/A / null 都显示为缺失,不会变成 0;不匹配数字格式的文本型单元格也按缺失处理。解析发生在浏览器本地,CSV 不上传、不保存、不发送。
进入色阶计算时,缺失值不进入当前表的最小值与最大值集合。颜色再按这两个边界线性映射到五档青到紫的顺序色阶。渲染时,缺失使用灰色虚线并标出“缺失”;真实 0 保留它在色阶中的颜色,同时加黑框。这样既能通过颜色判断数值落在哪一档,也能通过边框确认这个数值是否恰好为 0。
数字是颜色之外的核对通道
矩阵单元格里直接显示数值,是为了在颜色之外保留核对通道。黑框提示这里需要确认零值,单元格数字则给出未经色阶概括的具体值;灰色虚线说明此处没有进入数值映射。下方原始表继续保留输入口径,空白、文本标记和原始数字可以相互对照,不必只凭色块猜原表写了什么。缺失也不会在展示过程中被补成零。
当多个数值落在相近的颜色档位时,单元格数字比色块更适合核对;当读者怀疑零值或缺失被混淆时,边框、虚线和原始表又提供了不同层级的确认。颜色负责表达顺序,文字负责说明状态,原始输入负责保留口径,各自分工不应混在一起。
下次面对自己的热力表,可以先用这个判断口径:精确的 0 是否仍被当作数值;空白是否保持无值;NA / N/A / null 或其他非数字文本是否只进入缺失通道;缺失是否既不参与颜色映射,也不借用零的颜色。随后再查看矩阵数字和下方原始表,确认颜色没有覆盖输入事实。需要填补时应另行作决定,但展示层不应替输入做这个决定。relitu.cn 保留这套区分,也不据此做统计检定、预测或因果判断。