---
name: data-visualization-discipline
description: >-
  数据可视化的判断层
  SSOT——画任何图表、dashboard、看板之前先加载它，不是画完之后。管"该不该这么画"：这张图想让读者得出什么结论、用均值还是中位数、能不能聚合、堆叠还是折线、能不能上双轴、配色与颜色数量、同一实体跨图是否同色同位、表格该留几列。介质无关：HTML
  报告页、React/Vue dashboard、PPT 原生图表、matplotlib/plotly/ECharts/D3、渲染成 PNG 的图，一律适用。Use when
  动手画图之前，或评审既有图表（"这几张图有什么问题"、"图例为什么不一致"）。Not for 报告页的排版/组件/交互（用 report-with-html:report-with-html）或
  PPT 原生图表的实现与渲染陷阱（用 deck-creator:deck-creator）。
---

# 数据可视化纪律

这是可视化**判断层**的唯一权威源。其他 skill 引用它、不复制它——一条规则出现在两处，就多一个将来会矛盾的地方。

## 边界：什么归我，什么不归我

| 问题 | 归属 |
|---|---|
| 这张图想让读者得出什么结论？该用什么图型？用均值还是中位数？能不能聚合？几个颜色？ | **本 skill** |
| 报告页怎么排、用哪个组件、什么皮、交互键位、浏览器渲染自验、认可语料 register | `report-with-html:report-with-html` |
| python-pptx 怎么落原生图表、次轴折线在 QuickLook 不渲染、中文掉字 | `deck-creator:deck-creator` |
| 图表用什么库实现 | 当前项目已声明的图表栈；没有就先调研选维护中的库，**禁止手搓图表引擎** |

参考文件清单见下一节末尾的表（按阶段锚定，一处维护）。

---

## 这份 skill 怎么组织的（**加规则之前先读这节**）

规则按**你在什么时刻会想起它**排，不按主题分类：**定意图 → 验数据 → 选形 → 编码 → 交付前自检**。

**阶段 1–4 各有「交接检查」，阶段 5 是交付闸，交付前那道最重。** 这不是"一道闸抓所有规则"——那会把闸撑到十几条，而检查清单一超过 9 条就开始被跳过（Gawande）。成熟做法是**多个停点各管各的**：飞机在滑行、起飞、巡航、落地有各自的清单，不是一张。所以本 skill 的判据是：

> **每条规则都必须被相应阶段的检查点抓住。** 不是每条都要进交付闸。

这个轴不是审美选择，是防膨胀装置。一份按主题堆叠的规则集会一直长——每收编一处沉淀就多几节，最后没人读得完，也没人知道新规则该放哪。所以：

**加一条新规则前，先回答：它在第几阶段被想起？它的违反被哪个检查点抓住？**

- **都答得上** → 写进那个阶段，正文里说清判据，并确认那个检查点的产物清单真的会暴露它。
- **答得出阶段、答不出检查点** → 把它加进**那个阶段的交接检查**（阶段交接不受 9 条预算限制，因为它只在那一刻问一次）。只有当它必须在**交付前**再查一遍时，才动交付闸——而交付闸是 5–9 条 killer items 的预算，加一条得说清挤掉谁。
**这条准入规则同样管存量。** 最容易漏的不是新规则——是**规则立起来那天已经在文件里的内容，没人回头用它筛一遍**（"祖父豁免"）。但也不能因此开一张无边界重构的许可证，所以判据是有范围的：**每次实质改动这份文件时，顺手对你本次已经打开的那一节做一次同样的核对**；不为找问题去打开本次不涉及的章节。

**写完之后必须机械核一次，别靠记性**——把新规则的关键词 grep 一遍，看它在**检查点文字**里出没出现。**0 命中 = 它没挂上任何检查点**，回到上面几条重新归位。

以下限定缺一不可：

- **范围要说死**：各阶段的「阶段 N 交接检查」引用块 + 交付闸的**编号条目正文、产物行、以及豁免表**。豁免表要搜，但**它的命中意义是相反的**——见下一条。
- **>0 命中 ≠ 挂上，必须读那一处**。命中的可能是"这条闸在查这件事"（真挂上），也可能是"这条闸声明自己**不管**这件事"（豁免行）。**只在豁免行命中 = 反向证据**：它恰恰证明这条规则被明确排除在检查范围之外，等同 0 命中，要回去重新归位。
  > 例如，若"纯 KPI 数字卡片"只出现在闸 8 的豁免行、正文与产物行没有对应判据，说明该规则被排除。不能把"不管 KPI 卡片"读成"已经挂上"。
- **换 2–3 个同义词再搜一遍**：实测过一次假阴性——搜"色盲"全文 0 命中，但文件一直用"**色觉障碍**"讲同一件事，只搜一个词会误判成"完全没覆盖"。
- **这个动作只对「写进阶段正文」那条出口有验证力**。直接写进交接检查的，grep **必然**命中（那个词就是你刚放进去的），**等于什么都没验证**——那条路径要反过来问："交接检查里这句，**正文里有对应的判据吗**？"没有的话它是一句无处可查的口令。判定为**战例**的则**整个跳过这一步**：战例本来就不该出现在检查点里，0 命中是正确结果，不是失败。

- **例外：正向动作不配闸。** 阶段 1「画法没有明显答案时：批量出候选」不是"禁止什么"而是"该做什么"的规则。这类**生成性**技术没有可判失败的违反形态——硬给它配闸只会在"画法本就明显"的常见情形上误杀。它的归位方式是**挂在最近那个检查点上做条件子句**（阶段 1 交接第 4 项之后），不单列。
- **答得出**不止**一个阶段**（两个都说得通，不是答不出）→ **多半说明它是两条规则粘在一起，拆开**，每半各归各的阶段。真实例子："做图前先问会不会被黑白打印"能同时论证阶段 1（受众 × 介质，早问省重做）与阶段 4（技术解法与"红绿不能是唯一通道"同源）——正确处理是拆：**触发条件**进阶段 1 交接、**技术解法**并进阶段 4 既有规则。拆不开、确实是一条 → 放**更早**那个阶段（早发现便宜）。
- **哪个阶段都答不出**（一个都说不通）→ 要么不属于本 skill（介质实现层归 report-with-html / deck-creator，见边界表），要么它根本不是规则、是**战例**。

**反模式一节是纯指路表，不写判据**——只有"看到什么形态"和"去哪读"两列。同一条规则在正文和速查各说一遍，就是一处将来会分叉的复制。

> 速查表的历史审查曾混淆"正文指路"、"正文复述"和"正文未覆盖的规则"。**判据必须可机械执行**——"这条在正文有吗"必须去 grep 正文原句，不能凭印象数。

| 参考文件 | 什么时候读 |
|---|---|
| `references/chart-selection-and-statistics.md` | 阶段 2–3 的完整判据与实证出处：统计量、聚合、图型、配色 |
| `references/visual-form-selection.md` | 阶段 3，且**内容不是现成数字**时：定性 / 抽象 / 过程内容该画成什么形状 |
| `references/constrained-relationship-layout.md` | 阶段 3，关系图同时承载位置、职责、端口或部署状态时：先固定语义约束，再布局、追线和增量更新 |
| `references/graphical-perception-science.md` | 被质疑"凭什么这么画"时：Cleveland & McGill / Bertin / Tufte / Few 的出处，以及这些理论互相冲突的地方 |
| `references/transaction-status-colors.md` | 阶段 3–4，交易列表难以区分扣款、退款、待处理、取消/失败时：套用颜色语义与第二通道的合成案例，并按闸 4–5 验读者是否读对 |
| `references/monthly-budget-disclosure.md` | 阶段 3，累计预算的概览与月度明细并存时：用合成案例区分月度贡献与精确查数；交互验收交给 frontend-visual-qa |
| `references/operational-state-matrix.md` | 阶段 2，监控、可用性、证书或 Agent 工作状态，含历史时间窗的状态判断 |

**先读哪个**：动手画图 → 直接按下面的阶段走；内容是定性的、不知道画成什么形状 → 阶段 3「内容不是数字时」+ `visual-form-selection.md`；被质疑"凭什么这么画" → `graphical-perception-science.md` 拿实证出处。

---

# 阶段 1 · 定意图：这张图为谁存在

**这一阶段决定图存不存在，不决定它长什么样。** 走完它你手上应该有：受众与形态、北极星指标、以及每张图一句"读者应得出 ___"。

### 元教训：没问业务意图就开做

被客户点名的**最大方法论问题**不是画得丑，是**没问就开做**。

可视化的失败几乎从不是"画得不够漂亮"，而是**判断错了**：把过程指标当主角、用警示色标正向成果、把极值当全局、给老板塞一屏交互细节、拿过期数据画图、做错了分析对象。

**动手前先问每个视图**："要回答什么业务问题、给谁看、看完做什么决策？"
**口径拿不准就让业务方专门讲，别自行假设。**

> 可视化是**业务判断的表达**，不是画图技术活。

---

### 这张图想让读者得出什么结论？

> 原话："**这个图想表达什么？想让观众得出什么结论？**"
> 又一次："**这个没有任何意义，你想给谁看？看了之后得到什么结论？**"

**判据**：为每一张图写下一句话——"读者看完这张图，应该得出 ___"。**写不出来那句话，就删掉这张图**，不是换个画法。

**先分级：一个产物只有一个北极星硬指标，其余全降级。** 北极星 = 直接衡量业务成效的那个（经销商场景 = 线索，不是播放），视觉上必须最突出；过程指标刻意降级、该删就删。**每个指标上图前问"它挂得上一个决策吗（so-what → now-what）"，答不出就不进**——这是"洞察驱动"与"数字罗列"的硬闸门。**删指标比加指标更难、更值钱。**

> war-story：客户反复说"看数字没用""不要虚头巴脑的数字"，明确要求删掉完播率、互动率——对高净值赛道它们是负信号。"高播放 ≠ 高线索"：18 万播放出 10 条线索，不如 5 万播放出 18 条；让播放主导视觉会把决策者带偏去追流量而非成效。

这一问最常失守的地方：

- **占了大版面却达不到效果 = 结构性错误**。原话："**你用了一整页 PPT 的一大半部分来画出来这三条横着的柱状图，但是没有达到任何效果，这是我不能接受的结构性错误。**" **判据可量化**：一个视觉占了多少版面，就要交付相称的洞察量——占半页却只说了一句常识，是结构性错误，不是"稍微有点浪费"。
- **把作者的数据管道当洞察**：取数口径、测量覆盖、"我抓到了多少条"——那是你关心的事，受众要的是业务结论。测量完整度是**脚注口径**，永远不上主视觉。**判别问句**：把这个视觉给最终受众（老板 / 总部）看，他据此做什么决策？**答案若是关于"你数据抓全没抓全" = 管道噪音**，移进脚注。
- **把两个量并置却说不出为什么**：并置本身就是一个论断，说不出论断就别并置（见双轴那条）。
- **标题里塞了几个限定语，它就在做几件事**。原话："**'单条播放中位数（分平台，不合并）· 附爆款极值' 看不懂，这个图你想表达什么？你混合了好几种东西。**" 一个图名需要三个括号才说得清 = 它是三张图。**修一个问题时别把修法也堆进同一张图**（"分平台不合并"是上一轮的修正，塞进标题后这张图同时在讲中位数、讲分平台、讲极值）。
- **同量纲 ≠ 可同图：系列的"机制"也必须相同**。那张图把**客户端信息缺失率**（电费/屋顶——取决于客户愿不愿说，四家普遍 70%）和**销售端动作缺失率**（跟进有没有记——取决于销售做没做，0%–74% 差异极大）画进同一张 9 条系列图。两者单位都是"空缺 %"、量纲相同，但**背后机制完全不同**：读者用同一套解释读不通，于是"看不懂"。**判据：这些系列能不能用同一句话解释它为什么高或低？不能 → 拆成两张，各讲一件事。**
- **装饰 / 氛围图里的图表形象（上扬趋势线、仪表盘、数字卡）同受这一问检验，不因"只是配图"而免检**。判据是**删形测试**：把这个图形从画面里删掉，损失的是氛围还是一个数据主张？损失主张，它就得答"读者应得出 ___"——认证前 / 无数据场景答不出，读者却会把它读成"我将看到的数据长这样"。反向边界同样成立：不带轴、不带数、不指向任何真实指标的抽象形状（光晕 / 网格 / 渐变）不是图表，不进本 skill 管辖——把装饰全禁和把假图表当氛围放行是同一种不动脑。判据只裁定"这是不是一个数据主张"，不裁定"能不能用"——裁定成立而结论句答不出时，动作是**呈 owner 拍板，禁默删也禁默留**：owner 知情后拍板保留是合法收口，评审者先行删除同样越权（2026-08-12 登录页战例）。

### 画法没有明显答案时：批量出候选，别纠结一版

> 原话："**多给线索做一些可视化，大量做，不同类型、不同维度、不同数据，让我来挑。**"

这份 skill 几乎全是"删 / 砍 / 禁"方向——那是**收敛**工具。但有一种时刻需要相反的动作：**画法本身没有明显答案**（新指标、新受众、没做过的分析角度、下面那张"唯一画法"表套不进去）。此时正确的动作**不是闷头做一版然后等着被批**，而是批量产出不同类型 / 不同维度 / 不同切法的候选，一次摆出来让拥有者挑。

**这不是把活甩回去——判据在于你交出去的是什么**：

- ✅ **做完再让选**：真的画出来的 N 张图摆一起，他扫一眼就知道要哪张（这是 `show, don't ask` 在发散期的形态）
- ❌ **不做就问**："你想要柱状图还是折线图？"——那是把你的活外包给他

**和收敛闸的关系**：候选阶段**不走交付闸**（那会把发散扼死）；**挑中之后**，被选中的那张才进阶段 2–5 的完整流程。

**同族能力**：视觉风格方向的批量对比 → `design-style-picker` skill（它做的就是"批量生成不同设计方向让用户挑"，而不是猜一个最终稿）。

### 受众决定形态：高层要静态结论图，操盘手才要交互

同一份数据给不同人看是**两种产物**。先定"受众 × 使用场景"再动手。

- **老板 / 总部 / 投资人（汇报）**：一眼扫完的**静态结论图**，不要交互 / 下钻 / 堆细节。
- **操盘手 / 运营（日常）**：可 hover / 下钻 / 联动的交互工具。
- 汇报要有**一条主线**贯穿，别碎片化。

> war-story（2026-09-18）：favbase 收藏工作台被误判为「操盘手的日常工具」（交互优先、说明从简），被纠正「这不是操盘手的日常工具」——它是团队共享知识库的浏览与策展界面，第一次打开的协作者也要读懂「这是什么、怎么把好东西提升进共享层」。**受众判断先查用户原话的主语**（「团队共享」「给她看」「我自己用」），不要默认「= 用户本人日常操作」；主语是「我们/团队」时，页面必须对第一次打开的人自足。

> war-story：我想把四家趋势做成可交互（勾选账号），被否——原话："**领导只需要看到一张静态完整的图，不需要跟着我的眼睛跳，他看一下四家分布就过了这一页。**" **汇报场景里交互是负担。** 另：汇报的"成果截图"和产品的"工具 demo"是两个东西，别混。

**但静态不等于孤立**：原话"**没有关联的数据没有意义**"——一堆互不相干的总览数字对决策没用。（这句出自一个**交互产品**语境，那里的修法是「让 tab 能跳转」；**放到静态汇报上，修法不是加交互，而是让关系在同一张图里可见**。）

**可检验的落法**：静态图里每个数至少与一个对照数有**显式**关系——同轴、同行、差值标注、或「vs 上周 / vs 标杆」。**产物：写得出这张图的对照清单**（哪个数对哪个数）。写不出来 = 这些数是孤立的。

---

> **做了又被砍的案例**（转化漏斗 / 完播率 / 对标做错对象 / 全静态 / 卡片堆虚数字 / 没问意图）——它们的规则分散在下面各阶段。
>
> **阶段 1 交接检查**——**动任何数据之前**，手上必须有以下产物：
> 1. **受众 × 形态**一句：汇报（→ 静态结论图）还是操盘（→ 交互工具）？
> 2. **北极星是哪个指标**，以及它凭什么是北极星——判据是「受众做决策时直接依赖它」，不是「它的数最大」。**纯定性产物**（流程图 / 状态示意，无任何量化指标）记「不适用」，第 1、3、4 项仍必填。（这条豁免闸 1 也有；写在这里是因为**这是它第一次被需要的地方**，让人到交付前才看到等于没写。）
> 3. **每张计划中的图一句「读者应得出 ___」**（操作型产物用变体「读者看完应该知道下一步做 ___」；计划中的"图"**含装饰 / hero 图里被删形测试裁定为数据主张的图表形象**——它们不会被数进"图清单"，恰是最常整条绕过本检查的一类，判据见上文装饰图 bullet）。**此刻还没看数据，写的是这张图要回答的决策问题**（"应得出四家里谁领先"），交付时由闸 1 校准成实际结论（"广州领先，是第二名的 3 倍"）。**写不出那句话的图，在这里就删掉**（唯一例外：装饰图表形象答不出**不由你删**——呈 owner 拍板，见装饰图 bullet）——别带着它去验数据、去选形，那些工时全是白花的。
> 4. **对照清单**：每个要上屏的数，对照物是谁（vs 上周 / vs 标杆 / 同轴同行的另一个数）。
>
> **条件子句**：若第 3 项写得出结论句、但**画法本身没有明显答案**（阶段 3 的"唯一画法"表套不进去），合法动作是**批量出候选让拥有者挑**（见上面「画法没有明显答案时」），不是硬选一个往下走。候选阶段不走闸，挑中之后才进阶段 2。
>
> **为什么放在这里而不是只靠闸 1**：北极星选错会连锁决定所有图的排序与视觉权重，等交付前才发现，是全部重画；而这些内容在动手前写下来只要几分钟。闸 1 在交付前复核其规定的产物——那是最后一道拦截，不是第一次思考。**第 4 项对照清单只在这里查一次**：它决定的是"这些数之间有没有关系"，那是画之前的事，交付前才发现数是孤立的，等于整页重来。

---

# 阶段 2 · 验数据：这个数站得住吗

**图画得再对，数错了整张都是假的。** 这一阶段的产物是：每个上屏的数，你都能说出它的统计量为什么这么选、分母干不干净、以及它支撑得起你要下的那个论断。

### 这个数要拿去做什么决策？（决定统计量）

> 原话："**大原则：少看平均数，没有意义。**"

**按用途选，不是按分布形状选**：汇报"典型值"→ median + 分位数；推算"总盘子"→ mean（且说明是用来推总量的）；分布偏态 / 多峰 / 有离群点 → **让分布本身可见**，别只给一个数。

mean 与 median 差得远，本身就是偏态警报。多峰分布下两个都别单独报——它们会落在"没有人"的位置。

**偏态还有一个时间维度，很容易漏**：按周 / 按月合计的数，先看它是不是由**少数几天**贡献的。一家"本周 64 条线索"里 32 条来自两天、其余五天回落到个位数——那是单条内容爆量的**脉冲**，不是稳态能力；按周合计去判断"这家能打"会高估它的可复制性。**判据：top-2 时点占了合计的多少？过半就得在图上让这件事可见**（画到日粒度、或标一句"其中 X 天贡献 Y%"）。

Anscombe / Datasaurus 证明统计量全同的数据可以长得完全不同：**报聚合数之前先看过分布图**。

**算任何率 / 占比之前，先数分母里有多少"未知"**——把"不知道"当成"否"是最常见的静默造假，它会系统性压低任何正向率。点破后我自己承认过："**我糊弄了——用含大量「未知」的字段硬算了比例，分母没排除未知，把「不知道」当成了确定值。**" 完整判据（未知进不进分母、有阈值必须判阈值、覆盖率太低就别画分布）见 `references/chart-selection-and-statistics.md` §1d。

### 末期是不是还没走完？（时间序列的分母是天数）

周报 / 月报最常见的静默造假：**最后一个周期还没过完，却和完整周期画在同一条线上。** 它的分母是"已过去的天数"，不是一周——数字天然偏小，读者看到的"暴跌"是日历造成的，不是业务造成的。

**标个颜色和星号不够。** 真实验证：一份四宫格周报把未完成周画成浅色 + 红星号 + 脚注，一个只想拿结论的读者仍然卡住——"那湖南这个 178 到底是真跌了，还是这周没过完？**这直接决定我要不要去质问湖南，但我判断不了。**"

**三选一，没有第四种做法**：

1. **不画**——末期不完整就不进图，图只画到最后一个完整周期；
2. **画在另一根线上**——不与完整周期连成同一条折线 / 同一组条形（连起来就是在邀请读者做那个不成立的比较）；
3. **换成可比口径**——日均值、或"同口径进度对比"（本周前 4 天 vs 上周前 4 天）。**这个换算必须应用到本图的所有周期，不能只转换未完成的那一个**——只转末点会在同一条线内部造出两种口径，比原来的问题更隐蔽（例句里"上周前 4 天"就是这个意思，别只看"三选一"）。

**判据**：这个末期点，读者能不能不看脚注就知道"它不可比"？答不出就是没做到——脚注是给较真的人看的，不是给一眼扫过的人看的。

### 全产物一个口径：截止日、周的定义、来源，只能有一套

同一页里出现两种"周"、三个截止日、两个数据来源，读者不会去猜哪个对，他会**对整页所有数字打折扣**。

> 真实读者原话："**一页纸三个截止口径，我不知道信哪个。**" 另一处："同一页纸，'一周'有两种算法，我对不上。"
> 更狠的一条："上半页说每周四家总共发 29–42 条，下半页说本周发了 78 条……**同一类数出自两个来源、差出一倍，不解释清楚，我对这页所有数字都会打折扣。**"

**判据**：写下以下字段，全产物只能各有一个值——**截止日**、**周期的定义**（自然周？滚动 7 天？周五到周四？）、**数据来源**。真有必须不同的（比如两个来源本就不同系统），**必须在图上显式对齐一次**：说清差异从哪来，以及**读者该怎么理解这个差异**——是其中一个更准（说明哪个），还是两个都准、差异本身就是这张图要讲的事。**不能只在两个脚注里各写各的**——那不是解释，那是把矛盾留给读者发现。

### 这批数据能合并吗？（验聚合有效性）

> 原话："**把不同平台的播放中位数合并有什么意义？不同平台为什么要合并？**"

**合并之前先证明可合并**：按主要分组变量（平台 / 渠道 / 地区 / 时期 / 口径版本）分层看一遍，**方向不一致就禁止只报聚合数**。

口径不可比的分段算出的"总中位数"不描述任何真实总体——它既不是 A 平台的典型值，也不是 B 平台的。正确做法是分列，要总盘子就报总量。

机制是 Simpson's paradox（Berkeley 录取、COVID CFR 两个经典案例），详见 §2。

---

### 数据是地基：真实 > 漂亮

图画得再对，数据错了整张都是假的。

监控、可用性或证书矩阵先读 [运维状态矩阵案例](references/operational-state-matrix.md)：用项目的观察契约判断当前证据，让未知、来源失败及多路分歧保持可见。状态判据仍由项目实现维护；本 skill 负责这份证据能支持什么结论、读者能否看出风险。

- **真数据是底线，绝不用过期快照糊弄。** 画图前先确认：这份数据是"此刻实时"还是"某天的快照"？对外的关键数字必须可溯源到权威实时源。
  > war-story：我用 repo 里的旧 csv 算出一个数、业务方核定另一个数，去拉实时源 + 按口径重算，全部复现核定值，证明**不是数据打架，是我的快照过期 + 没做口径**。
- **口径常含人工判断，关键数字以人工核定为准，图上标口径。** 起算日 / 截止日 / 排除项写进脚注——同一指标口径不同会变成纠纷点。
- **KPI 置信分级**：合同强义务 / 口头对齐 / 对标阈值，三者置信度不同，别都标成"合同 KPI"。
- **PII 脱敏**：含手机号 / 身份信息的表，做给第三方看的图一律脱敏（展示"数量 + 画像"，不展示联系方式）。
- **标数据可信度**：点赞 / 转发等有系统性失真（刷量），呈现要标可信度，别当真实热度。
- **脏数据先归一化再画图**：跨平台字段不统一、日期多格式、各家列数不齐——先做字段映射 + 容忍缺列 + 标完整度。**缺数据直接找业务方要，不将就脏数据。**

对外呈现还有 **"违反会引爆退款"的红线**（线索分层 / 高净值别用通用互动率 / 标失真 / 单周差数据不能证伪方法论 / 不背转化率责）。


---

### 关联要诚实：弱关联用趋势，绝不假装精确归因

数据支撑不了精确归因时，**诚实的弱关联 > 漂亮的假精确**。

> war-story：线索只记录到"平台 + 日期"、到不了具体视频。所以用**按周聚合的趋势并置**看两个峰是否同步，而不是编造"这条视频精确带来这条线索"，并配注脚说明。

**砍什么、画什么——一句话分清**：**砍的是数据撑不起的结论，画的是缺失本身**。分母 30% 未知 → 把未知画成显式一段是合法的（那是事实）；拿这份数据硬算「可装率」→ 砍（那个数字本身是错的）。

**降级优先于砍**：能诚实降级就降级（标成弱关联 + 注脚）；连弱关联都撑不起、或数字必然是错的，才砍。

**对应铁律：数据不支持的图直接砍——画得好不能救错数据。** 转化漏斗曾被评价「画得非常好、要保留」，最终仍因**无精确归因、算出来的转化率是错的**而砍掉——**「错的数据没什么可讲的」**。呈现质量和数据可信度是两把尺子，后者不过关，前者再高也留不住。

**为什么**：假装精确会让决策者基于错误因果做决策，比"我们只能看到弱关联"危险得多。

---

> **阶段 2 交接检查**——进入选形之前，对每个会上屏的数答四件事：
> 1. **统计量**：用途是什么（典型值 / 推总量）→ 据此选了 mean 还是 median？分母里未知多少条、怎么处理的？
> 2. **来源与口径**：这份数是**此刻实时**还是某天的快照？关键数字以谁的核定为准？**并且：现在就把整个产物的截止日、周期定义、数据来源各定成一个值，写下来。** 这一步是**定规格**，不是核对——图还没画，没什么可核的；它的作用是让后面每张图都有一个可遵守的对象。（真有必须不同的，此刻就写清差异从哪来。）
>    运维矩阵按上述案例给每个显示单元标明当前证据或未知原因；同一目标的多路分歧不能被聚合数遮掉。
> 3. **时间序列的末期完整吗**：最后一个周期走完了没有？没走完就按「不画 / 另起一根线 / 换可比口径」三选一处理——**不是标个浅色加个星号**。
> 4. **可发布性**：含 PII 吗（手机号 / 身份信息）——**脱敏是不可逆问题，过了这一关就没有第二次机会**；有系统性失真的指标（刷量）标可信度了吗？
>
> **闸门对应**：闸 6（聚合与归因体检）、闸 7（分母体检）。**数据来源的性质**（实时还是快照）**与 PII** 这两项只在本阶段查一次，不进交付闸——它们是上游性质的，等到交付前才发现快照过期，前面全白做。
> **与闸 3 的分工**：本阶段**定规格**（把三个值定下来、写下来），闸 3 **核对遵守**（图全画完之后，逐张比对有没有跑偏）。两处提的是同样三个名词，但动作相反——一个是"决定"，一个是"审计"。**只做前者会漂**（定了没人核，画的时候照样各写各的）；**只做后者太晚**（交付前才发现两种周定义，图全要重画）。

---

# 阶段 3 · 选形：该画成什么

**数确认可用之后，才轮到形状。** 顺序不能反——先挑图型再回头发现数据不支持，前面全白做。

### 图型语义：每种图只回答一类问题

#### 堆叠 = part-to-whole，不是比较各系列

> 原话："**不要把线索数量堆叠起来，不同经销商堆叠成一个图有什么意思？堆叠图是为了展示什么？这里一个折线图就够用了。**"

**判据一句话**：读者要比较**各部分**还是看**总量构成**？比较各部分 → **折线图**（每系列独立）或 small multiples；只关心总量构成且时点少 → 才可堆叠。

**为什么**：堆叠条内部是长度判断且**没有共同基线**（Cleveland 第 3 级），并列条是位置判断（第 1 级）；结构上只有**贴基线那层**起点固定可读，上面每层起点都在浮动。堆叠面积图中间层的"波动"是上下层位移的叠加**假象**。

**还有一条更隐蔽的**：**零在面积 / 长度编码里是不可见的。** 一个系列这期是 0，它就不占任何像素——**图上不会有任何东西告诉读者"这家这周挂零"**。先判这个零是否支持本图结论或读者下一步：决策相关的零往往正是最该被看见的事；没有叙事工作的零不因数据表里存在就强塞上屏。

> 真实读者原话："'谁这周是零'这件事图上是隐形的。我事后**拿总数减**才发现：苏州 W2 是 0，湖南 W1、W3 是 0。少一块颜色我根本注意不到，可'某家一整周一条线索都没有'恰恰是**我最该知道的事**。"

**这是编码方式的结构性后果，不是画图人疏忽**：任何"用面积 / 长度表示量"的图（堆叠、面积、条形、树图、气泡）都有这个盲区。若零支持结论，**修法不是换图型，是给零一个显式但不编码长度的形态**——带角色与单位的 0 值直标、网格底色、一行 ✓/✗ 徽标，让"没有"和"有一点点"在视觉上不同；若不支持结论就隐藏，不能留一个无角色的裸 `0`。

**同族判据**：凡"没有 = 没有像素"的编码，都要先问——**这个零是否支持结论或动作？** 是，就继续答"它长什么样、角色与单位是什么"；否，就明确隐藏。不能既不让它承担结论，又悬一个数字让读者猜。

#### 双轴：混量纲禁止，同量异单位无害

> 原话："**把播放中位数和当周发布量放到一张图里想说明什么？**"

拆成两种情况，别一刀切：

- **混量纲**（播放中位数 vs 发布量、收入 vs 增长率、绝对值 vs 比率）→ **禁止**。两轴范围可各自任意缩放，等于作者能随意制造任何程度的相关或交叉，读者会把人为造出来的靠近读成关系。
- **同一个量的两种单位**（°C/°F、元/千元）→ 数学等价，无害。

**替代**：拆上下两图共用 x 轴 ▸ 指数化到同一轴 ▸ 散点图直面相关 ▸ 次要系列降级为标注。

#### 桑基图/流向图：节点是实体不是动作，自己对自己走同一套颜色语义

> 2026-08-07 战例：一张"四家经销商线索互转"桑基图连续四次被打回，
> 根因全部是把这个图型的**结构性default**当成了理所当然，没有先问"这个图型天生容易在哪里出错"。

**判据一：节点命名必须是实体，不能是动作短语。** 左右两栏如果代表的是**同一组实体的两种角色**
（发出方/接收方、出口/进口、来源/去向），右栏节点就该跟左栏用**同一个名字**，不要为了"消歧义"
造动词短语当节点名。原话："你的接收方为什么是个动作？"——
消歧义应该靠**结构**解决（自己对自己的量单独一条链路），不是靠改名字解决。

**判据二：自己对自己的流量，不能因为"同一实体不该流向自己"的直觉而被砍掉或合并。** 三种常见的
错误处理，从最差到最不差：①完全删除该数据、退化成图外文字标注——把一块可能占总量相当比例的
真实数据从图里抹掉了；②把"所有实体的自己对自己"硬并成一个共享终点（比如一个统一的"本地"节点）——
这四条粗带子除了字面都叫"本地"外没有任何共同点，四个不同来源汇入同一个终点，读者天然会去找
"这四条为什么是同一件事"，找不到就是"看不懂"；③（正确）把"自己对自己"建模成 `src-X → dst-X`
这条链路本身，dst-X 的总量自然等于"自己对自己"+"从别处收到"——这是标准的双边（bipartite）
流向图画法（贸易流向图"中国·出口"和"中国·进口"同名同理），不是发明。

**判据三：颜色语义表（见上方"颜色即语义"）同样管桑基图，且更容易在这里失守。** 桑基图的
色带通常按"占比大小"分配视觉权重，作者容易把"哪个类别面积最大"和"哪个类别该用强调色"
混为一谈——而告警色（红）在规则里是**专属**给负向/需要干预的东西，一个"面积大但其实是机会/
待发展空间"的类别涂成红色，读者的第一反应是"这里出问题了"，语义直接读反。**先判断这个类别
在论点里是正向成果、需关注的机会、还是纯背景，再套用颜色即语义表里对应的颜色**，不要按
"面积大就给强调色"的直觉走。

**判据四：镜头/交互如果要"推近看某一条边"，目标是边到达的节点，不是整条边本身。** 一条
桑基链路的路径天然横跨图的整个宽度（从最左的源到最右的终点），任何"框住这条边再放大"的
镜头/裁剪逻辑算出来的包围盒都接近整张图的大小，缩放比例算出来恒等于 1（"zoom 不生效"）。
要做到真正的推近，目标应该是链路**到达的那个节点及其邻域**，不是链路本身的包围盒。

#### 其余

- **饼图**：类别 ≤3 且只要"大约几成"可用；要比较或类别多 → 条形。
- **系列 ≥ 6 条** → 拆 small multiples，且**所有面板同 x/y 范围、同轴、同色映射**。5 条及以下可留单图，但若线条频繁交叉、读者追不动某一条，同样拆。
- **条形的值轴必须从 0 开始**（纵向条看 y、横向条看 x；长度编码，截断轴直接推高 Tufte lie factor）；**线图不必**（位置/斜率编码，强制 0 会压平真实变化）。

---

### 内容不是数字时：先造量纲，造不出就别做成图

上面整节讲的是"已经有一批数"该选什么图型。但很多产物要可视化的是**定性内容**——流程、对比、清单、方案、素材。这半边的失败模式完全不同：**不是选错图型，是根本没有可视化，只是把文字装进了图形容器。**

**总判据：先造量纲。** 问一句"这堆内容里，什么东西是有序的 / 有大小的 / 有方向的 / 有对照的？"——找到那个量，把它编成几何（位置 / 长度 / 大小 / 方向）。**造不出量纲，就别硬做成图**，写成文字更诚实；给文字套个彩色边框不是可视化。

常见的"假可视化"：

- **量级信息写成文字标签**（"≥9 高频"、"改动量大"、"≥100万:4条 ≥10万:16条"这类纯文字阶梯）→ 编成条长 / 格数。原话："**这种纯文字我真的很难理解。**" 指着"线索 4·50%"："**这个不太好理解。**"
- **两列 / 网格小方块，位置不承载任何语义** → 空间必须说话：上/下 = 价值高低、左/右 = 演化、大/小 = 权重。原话："**一个罗列的、排列的、没有任何意义的小方块，我看不出来它俩到底能对比出来什么东西。**" 把清单劈成左右两列 = 没有分析结构。
- **"对比"做成并排列举、不标"对方怎样"** → 补上对照侧，让它成为洞察的**证据**（价值栈的用法见 `references/visual-form-selection.md`）。
- **内容本身就是视觉的**（成片 / 镜头 / 截图 / 帧）**却画抽象方块代替** → 换真图（真实缩略图 / 播放器 / 真截图），读者眼见为实。
- **单对象的多维数据摊成一排文字字段** → 收成富数据卡（评分格 + 折叠原文）。

**操作型产物多一条**：界面 / 工作台类的结论句不是"读者应得出 ___"，是"**读者看完应该知道下一步做 ___**"。原话："**这个告警工作台有点乱，分不清楚我该干啥。**" 乱 = 看不懂 = 该重做信息架构，不是调样式。

完整的形状选择工具 → `references/visual-form-selection.md`；画页面关系或用户旅程前，先读其「关系拓扑与有序旅程」，确定节点表示页面还是一次访问。

---

### 一个对象只画一次

> 原话："**一会四个进度条，一会四宫格，一会又是四个方块卡片……完全违背了方法论。**"
> "**为什么四家线索趋势要有两张图而不是一个连续的趋势？**"

**区分下面的情况，别混**：
- **同一个视图内**（同一页 / 同一屏）：数同一批实体被画了几次、形状是否每次不同——**>1 次且形状不同 = 违规**。修法是**合并成一处，或让每处回答一个不同的问题**。
- **有序旅程中的再次访问**不是重复编码：访问位置承载先后，页面身份仍指向同一定义；不要用“只画一次”合并掉返回步骤。
- **跨视图**不按形状判、按轴判：每个视图认领一个不同的分解轴（见 `references/visual-form-selection.md` §多视图分解）。所以"**一张 overview + 每维一个 detail**"是合法的，不算重复——别用单视图的判据去误杀它。

动手前先定这批实体的**唯一画法**，别边画边换。

**按"实体数 × 维度数"定唯一画法**：
- **N 实体 × 少属性** → **一张矩阵**：实体 = 固定行（按北极星降序）、属性 = 列，北极星那列做成条（共同基线，最高精度）。这是这批实体的**唯一**画法。
  > **北极星 = 受众做决策时直接依赖的那个指标**，不是最大的那个数。经销商场景通常是**线索量**（结果）而不是播放量（过程）。多指标拿不准就问需求方，别自己拍——排序错了会经闸第 4 条连锁到所有图。
- **1 实体 × 多维度** → 一张 overview + 每维一个**不同分析问题**的 detail。
- **N 实体 × 少属性 × 时间序列**（周报/月报最常见）→ **每个指标一张同构趋势图**（同实体、同形状、同色、同序）+ 可选一张快照矩阵。**同一批实体用同一种形状画不同指标，不算重复画**——重复的判据是"**同一个量**被画了两遍"，不是"同一批实体出现了两次"。快照矩阵答"此刻谁领先"、趋势图答"怎么变的"，是两个不同的分析问题。
- **多节并存** → 每节必须是**不同的分析问题**，不是同一问题换几何。

**"同一批数字"的粒度**：只有**同指标 + 同口径 + 同时间范围**才算重复。矩阵的本周值与趋势图末点有交集但不算重复（一个横比指标、一个纵看变化）；真重复是"同一个指标画成柱又列成表"。

累计预算与月度明细的边界案例见 [月度预算概览与详情](references/monthly-budget-disclosure.md)。

#### 切成观众视角找重复（判据在此，产物由闸 3 收）

> 原话："**你有没有按照观众的视角来审核我们的各种图例？**"
> "**表格和图表为什么有重复？**"

作者视角数"实体画了几次"会漏两类**隐蔽重复**——观众一眼觉得"又画一遍"、作者却觉得"不一样"：

- **同一数据换粒度再切一遍**：省份分布图 + 城市分布图，直辖市/省会导致"上海省 = 上海市"，作者想的是两个维度，观众看到同一批数字画了两遍。
- **同一个量换个说法再画一条**：combo 里"当月发布账号数"柱 + "累计参与账号"折线，观众看到的是两条账号数曲线。

**判据升级**：从作者的"画了几次"升到观众的——**"这两张图，观众会不会觉得在讲同一件事？"** 把所有图列出来两两问一遍。

**消重删哪张**：正解常是"**用更好的那张替代重复的另一张**"，不是删掉用户点过名的。**用户明确表扬过 / 要过的图 = must-have，消重时它是留下的那张——前提是它的数据可信度过关**（见「关联要诚实」：呈现质量和数据可信度是两把尺子，被表扬过的图数据不可信时照砍）。

**表扬的是什么（用来判断哪张是 must-have）**——下面这些数据对比样例表扬的是**洞察**和**信息传达**：
> "但我觉得你的这个**播放集中度和区域倒挂的洞察很好，继续保持**。"
> "这个页面里面的**矩阵和离散趋势**都不错"
> "它在**表格上是非常有一套**的，它的那个**颜色区分的这些标识**啊，都还不错"

判断这类图是不是 must-have，问“它揭示的洞察，别的图能替代吗”。这些样例不支持“用户不在乎美观”的普遍结论。用户明确要求改善整体观感时，按[独立验收判据](references/constrained-relationship-layout.md#独立验收判据)验收。

> 战例：为消掉"省份账号榜 × 播放榜"的重复，删掉了明确表扬过的**倒挂 tornado**，被纠正；正解是"用 tornado 替代两个独立榜"——既消重、又保住用户要的对比图。

---

### 表格纪律

> 原话："**表格里写这么多数字干什么啊谁能有时间看这些数字？表格里写这么多文字干什么啊谁能有时间看这些文字？**"

表格的默认失败模式是"什么都塞进去让读者自己找"。

交易列表中的金额与状态容易被读成同一件事；遇到扣款/退款/未扣款难区分，读 [交易状态配色案例](references/transaction-status-colors.md)，沿用下方列价值判断与阶段 4 的颜色语义。

- **每列先问"有业务价值吗"**，没有就砍——列不是越全越好。
- **能编成图形的数值别留在表里**：占比 → 条，状态 → 色徽标，评分 → 填格条。表格留给**需要精确查阅**的值。
- **文字单元格压到最短**：状态 / 元信息标签降级成小徽标，不配独占一列。
- **挤掉空白**：行高紧凑、单行显示，别让内容飘在格中央——原话："**你自己看不出来中间有一大片空白？**"
- **数值列右对齐 + tabular-nums**，位数对齐才能竖扫比大小；行首锚列加粗 + nowrap。
- **表头降调**（小一号灰字 + 底重线）——表头是骨架不是内容。

**和图重复的表格直接删**：同一批数字不要既画又列。

---

> **阶段 3 交接检查**——走完这一阶段你手上应该有：
> 1. **这批实体的唯一画法**（写下来那一句：N 实体 × 少属性 → 一张矩阵 / N 实体 × 时间 → 每指标一张同构趋势）；
> 2. **消重后的图与表清单**；
> 3. **每张表的列清单**，每列旁边一句"它的业务价值是什么"——答不出的列在这一步砍掉，别带进编码阶段。
> 4. **每张用面积 / 长度编码的图，零值处置是什么**——先写它是否支持结论 / 动作；是，再写它的显式非长度形态与角色单位（"线索数 0 条" / "补一行 ✓✗ 徽标" / "网格底色露出空格"）；否，写「无决策相关零值，隐藏」。
> 5. **凡内容不是现成数字的视觉**（流程 / 对比 / 清单 / 素材）：写下**它的量纲是什么、编成了什么几何**。写不出量纲的，这一步就改回文字——别让它带着"图形容器装文字"的形态进编码阶段，那时候只会被调样式，不会被改回文字。
>    关系图的位置、包含和连接本身可承载语义，无需捏造数值刻度。命中空间/职责/端口约束时，按 [关系图布局](references/constrained-relationship-layout.md) 留下坐标轴含义、关键追线路径与状态图例；自动布局或“无重叠”不代替读图结果。
>
> **闸门对应**：闸 3（观众视角两两比对）、闸 8（轴与标值扫描）。表格的列价值只在本阶段查——交付闸不重复查，因为该砍的列早该砍了。

---

# 阶段 4 · 编码：量怎么变成形状

**形状定了，还要决定"哪个视觉通道承载哪个量"。** 这一阶段的错误最隐蔽——图看着正常，比例是错的、颜色说了反话。

### 编码通道纪律

**总纲（Munzner）**：变量的重要性匹配通道的显著性——最重要的量用最高效通道，**一个通道只编一件事**。

- **要读者准确读出或比较量 → 位置 / 长度**。颜色深浅精度最差，面积会被系统性低估。
- **颜色只承载类别或阈值，不承载量**。想用"颜色深浅代表大小"时只能用明度阶，且只承诺"看出序"，不承诺"读出差几倍"。
- **位置 / 长度通道**上，量的编码必须是纯线性 `长度 = k·值`，**禁止加性常数**（颜色通道不受此约束——它只承诺「序」不承诺比例，所以热力色用 `sqrt` 开方压极值是合法的）。原话："**为什么西南和其他四个区同样是 2% 的播放占比，但是它们俩的绿条条的宽度不一样？为什么质量漏斗的 4 条、16 条、53 条，这三个的宽度比例不成比例？**" `宽 = 140 + 值/max·440` 这种"固定底 + 比例"直接毁掉比例感——4:16:53 画出来不是 4:16:53，受众一眼看穿。
- **最终可见绘制跨度（painted span）才是长度编码**：公式里的 `width` / SVG path length 只是上游值，观众读到的是 fill 连同可见 border、stroke、line cap、marker、伪元素等合成后的跨度。定量 mark 禁用 `min-width`、固定端帽或固定边框把小值撑大；很小的正值可以保留真实的 subpixel 几何，把可读性移到外置数字、括号或 leader line。若业务确实需要一个“存在即看见”的最小点，把它画成**独立、明确声明不编码量**的 presence mark，不能混进被量测的条长。
- **标签上的数字必须和几何编码同源、同一档舍入**。"西南 1.6%" 和 "其他 2.2%" 都舍入成标签 "2%"、条宽却按真值画，就出现**同标签不同宽**的自相矛盾。**两个修法二选一**：要么都用真值（标一位小数区分），要么都用舍入后的整数（条宽也按整数算）。

#### 动态量化可视化：因果必须同位、同拍、同源

静态图只要标签与几何对得上还不够；动画会让观众把**时间上紧邻的文字与变化自动配成因果**。若动作 A 出现后，动作 B 的增量才突然把总量推高，观众会把 B 的增长误归给 A——即使数据本身没算错，动画仍在说假话。

**先过所有定量动画共用的转场语义基线**：跨帧保持对象身份与共同尺度；`duration > 0` 的补间必须在一个严格内部时刻 