---
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 条）——合起来五个检查点，交付前那道最重。** 这不是"一道闸抓所有规则"——那会把闸撑到十几条，而检查清单一超过 9 条就开始被跳过（Gawande）。成熟做法是**多个停点各管各的**：飞机有滑行、起飞、巡航、落地四张清单，不是一张。所以本 skill 的判据是：

> **每条规则都必须被五个检查点之一抓住。** 不是每条都要进交付闸。

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

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

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

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

三条限定，缺一条这个动作就会骗你：

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

> **为什么必须机械化**：这条准入规则在 2026-07 的一个月里被**同一个作者连续违反四次**——最典型的一次是他刚写完一条规则、当场忘了挂检查点，而那条规则的正上方就写着"每条规则都必须被某个检查点抓住"。**四次都是"我知道有这条规则"，四次都没执行**：散文提醒对作者本人无效，他正处在"我刚想明白一件事"的兴奋里，那恰是最不会回头自查的时刻。**能救的只有一条可以跑的命令。**

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

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

> 这条规则自己就漂移过：2026-07 第一次审计数出 6 条复述、收敛了那 6 条就宣布做完；一个月后逐条比对正文原句：29 条里 7 条本就是指路、**16 条是正文复述**、另外 6 条则是**正文根本没有的规则**（全是"内容不是数字时该画成什么"那一类，因为正文当时只覆盖了数字类图表）。**教训是判据本身要可机械执行**——"这条在正文有吗"必须去 grep 正文原句，不能凭印象数。

| 参考文件 | 什么时候读 |
|---|---|
| `references/chart-selection-and-statistics.md` | 阶段 2–3 的完整判据与实证出处：统计量、聚合、图型、配色 |
| `references/visual-form-selection.md` | 阶段 3，且**内容不是现成数字**时：定性 / 抽象 / 过程内容该画成什么形状 |
| `references/graphical-perception-science.md` | 被质疑"凭什么这么画"时：Cleveland & McGill / Bertin / Tufte / Few 的出处，以及这些理论互相冲突的地方 |
| `references/transaction-status-colors.md` | 阶段 3–4，交易列表难以区分扣款、退款、待处理、取消/失败时：套用颜色语义与第二通道的合成案例，并按闸 4–5 验读者是否读对 |

**先读哪个**：动手画图 → 直接按下面五个阶段走；内容是定性的、不知道画成什么形状 → 阶段 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` 在发散期的形态）
- ❌ **不做就问**："你想要柱状图还是折线图？"——那是把你的活外包给他

**和收敛闸的关系**：候选阶段**不走 9 条闸**（那会把发散扼死）；**挑中之后**，被选中的那张才进阶段 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。

---

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

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

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

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


---

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

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

> 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 实体 × 少属性 × 时间序列**（周报/月报最常见）→ **每个指标一张同构趋势图**（同实体、同形状、同色、同序）+ 可选一张快照矩阵。**同一批实体用同一种形状画不同指标，不算重复画**——重复的判据是"**同一个量**被画了两遍"，不是"同一批实体出现了两次"。快照矩阵答"此刻谁领先"、趋势图答"怎么变的"，是两个不同的分析问题。
- **多节并存** → 每节必须是**不同的分析问题**，不是同一问题换几何。

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

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

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

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

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

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

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

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

**推论**：一张图的价值 = 它承载了一个**可行动的洞察**，不是美观。判断某图是不是 must-have，问"它揭示的那个洞察，别的图能替代吗"，不是问"它好不好看"。

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

---

### 表格纪律

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

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

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

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

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

---

> **阶段 3 交接检查**——走完这一阶段你手上应该有：
> 1. **这批实体的唯一画法**（写下来那一句：N 实体 × 少属性 → 一张矩阵 / N 实体 × 时间 → 每指标一张同构趋势）；
> 2. **消重后的图与表清单**；
> 3. **每张表的列清单**，每列旁边一句"它的业务价值是什么"——答不出的列在这一步砍掉，别带进编码阶段。
> 4. **每张用面积 / 长度编码的图，零值处置是什么**——先写它是否支持结论 / 动作；是，再写它的显式非长度形态与角色单位（"线索数 0 条" / "补一行 ✓✗ 徽标" / "网格底色露出空格"）；否，写「无决策相关零值，隐藏」。
> 5. **凡内容不是现成数字的视觉**（流程 / 对比 / 清单 / 素材）：写下**它的量纲是什么、编成了什么几何**。写不出量纲的，这一步就改回文字——别让它带着"图形容器装文字"的形态进编码阶段，那时候只会被调样式，不会被改回文字。
>
> **闸门对应**：闸 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` 的补间必须在一个严格内部时刻 `0 < p < 1` 仍是有效数据图形，原子跳变才只检查边界前后。纯时间序列播放、过滤过渡、排序动画不需要虚构动作或增量，但不能借无效中间帧暗示不存在的关系。

**因果绑定的触发条件看叙事，不看图类**：定量 mark 随时间变化，且画面用动作/事件标签、增量/累计叙述或操作序列，把某个动作呈现为这次变化的原因时，执行下面的因果绑定。纯时间序列播放、过滤过渡、排序动画若没有动作标签与因果声称，可把因果子项记「不适用」，只走上面的转场语义基线。

每条累计轨道先声明 `{ track, unit, initialTotal }`，再把一次定量变化建成一个原子事件：`{ id, track, operation, label, delta, from, to, at, duration, sourceMeasure?, groupId? }`。`operation` 明说这是新增、回收、`transfer-out`、`transfer-in` 还是重置；`from / delta / to` 必须使用轨道的同一单位。标签里另有来源规模（如「1.4 万字」）时，放进 `sourceMeasure: { value, unit }`，**不得把字数猜算成 context token**。**区间几何 `[from, to]`、贴段标签、`+delta`、累计值 `to`、播放/步进锚点都从这一个事件派生**，禁止分别硬编码。

跨轨道转移用共享 `groupId` 的成对事件表示：恰好一条 `transfer-out` 与一条 `transfer-in`，两端共享 `at / duration`，各自在自己的轨道上计算 `from / delta / to`；锚点顺序只要求**每条轨道内**严格有序，不禁止不同轨道同拍。另建一行 transfer 台账 `{ groupId, outEventId, inEventId, loss, conversion? }`：`loss` 是非负轴单位，等于明确丢弃 / 压缩 / 损耗的量，并且 `loss > 0` 时图内必须有对应 mark。两轨单位相同时必须满足 `out.delta + in.delta + loss = 0`；单位不同时必须给出显式 `conversion: { fromUnit, toUnit, rate, reason }`，先换到同一单位再验守恒。不能用「转移」掩盖差额，也不能只在散文里解释一个没有结构字段与图内 mark 的差额。

- **同位**：动作标签必须贴在它实际占据的 mark / 区间上；放不下就用括号或 leader line 指向那一段。标题、图例、旁栏可以复述，**不能是动作与几何之间唯一的映射**。
- **同拍**：标签、增量、区间增长与累计值在同一个事件时间坐标开始，并使用同一个归一化进度。easing 可以改变速度，不能制造第二只钟；条还在补间时，累计值也必须显示同一进度，或四者一起在边界帧跳变。
- **同帧阅读顺序：动作 +Δ → 累计 T**：显著跃迁或相邻两次增长必须逐事件拆开，并让观众按这个顺序读懂；这里的箭头是语义关系，**不是先播增量、再更新总量的两个时间阶段**，时间上仍须同拍。禁止只把旧总量突然换成新总量，让前一个动作替后一个动作背锅。
- **逐步模式必须留证据帧**：每次因果变化至少有变化前与稳定后的可停留帧；回收、转移这类过程还要有可见中间帧。键盘 gate / step 不得跨过建立因果关系的那一帧。
- **密度不是搬走标签的理由**：事件多时只保留“当前事件”的直接标注，已完成事件可降噪；不要把所有标签永久铺满，也不要把当前标签退回标题区让观众自己映射。

**无锚点的解释文案不是证据**：如果删掉标题下的说明 / 洞察旁栏后，读者就不知道哪次操作造成哪段增长，说明几何没有完成表达；如果删掉后解码不受影响，那段文案就该删。

#### 颜色即语义：警示色专属负向，正向成果绝不用红

> 原话："**为什么这个线索用红色警示色？**"

配色前先给每个量**定性**：正向 / 负向 / 中性 / 告警。**告警色必须专属，不能复用到正向。**

| 量的性质 | 用色 |
|---|---|
| 正向成果（线索 / 增长 / 达成） | 绿，或中性墨黑大字 |
| 告警 / 异常 / 风险 | 红（**专属，别处不用**） |
| 需注意 / 待办 | 琥珀 |
| 中性数据 | 墨色 / 蓝 |

**为什么**：颜色是看图人**第一眼**的潜意识输入，比文字快。红 ≈ 警报，贴在好消息上会瞬间误读，还会和监控页的告警红撞色——一眼像出了问题。**定色前先问"这个数是好事还是坏事"。**

配套两条：

- **配色可借领域隐喻**（能源项目用发电绿 / 太阳能琥珀 / 数据蓝），色彩自带行业语言。**但领域隐喻色不得与语义色撞**——同一份产物里，琥珀若已经是「待办 / 存疑」的语义色，就不能同时当「太阳能」的领域色，否则读者分不清这块琥珀在说什么（总纲：一个通道只编一件事）。撞了就给领域概念换通道（图标 / 位置 / 标签），别换语义色。
- **强调色克制**：主色只在关键处点缀。**可判据**：数一下主色 / 强调色在一屏里出现几处——超过 3 处就不叫强调了。
- **热力色要压极值**：用 `0.05 + 0.5*sqrt(value/max)` 这类开方加基础透明度兜底，否则一个极值独深、其余惨白，看不出差异。

#### 颜色数量与身份

> 原话："**这几个颜色要表达什么？一张图里有 9 个颜色。**"
> "**就四家经销商，为什么每一张图的图例颜色都不一样？**"

- **类别色实际可用上限 6–8**（ColorBrewer qualitative 色板多数 8–9 封顶；Adobe Spectrum：6 色起变难懂、12 色极难）。**数的是类别色**（编码实体/分类的那些）；**语义色**（达标绿/未达标红/状态徽标）另算、不计入这个上限，但它自己要全报告方向一致。超了**不是加第 9 种颜色**，而是：合并长尾为"其他" ▸ 拆 small multiples ▸ **高亮少数关键系列 + 其余统一灰色** ▸ 直接线端标注删图例。
- **同一实体跨图必须同色、同位、同序**（"**同位**"= 在有固定位次的呈现里位置一致：矩阵行序、图例顺序、small multiples 的格位；折线图里线的位置由数据决定，此时"同位"指**图例顺序**）。最常见的违反方式是**让绘图库按出场顺序自动配色**——同一家在图 1 排第 2、图 3 排第 5，默认配色必然错乱。**多图报告的起手动作是先建"实体 → 颜色"映射表**，全文引用，显式传入。
- 反向约束同样成立（Qu & Hullman 2018）：**不同字段必须用不同色相、色板不重叠**，否则读者会把两个无关字段误当同一个。
- 语义色（好/坏、涨/跌、达标/未达标）全报告方向一致。
- **红绿不能是唯一的区分手段。** 约 8% 的男性有红绿色觉障碍——而本节推荐的"正向绿 / 告警红"恰恰是最常见的那对。**每一处用颜色区分状态的地方，必须还有第二个通道**：形状、位置、直标文字、或明度差（红绿在灰度下常常同亮度，明度差要真的测，不能想当然）。categorical 系列色从 token 取时同样过一次色觉障碍（CVD）验证。

---

### 每个数字必须标清"什么维度、什么单位"

> 原话："**你的第一个页面里的月度发布趋势的这个数字是什么意思？什么维度的什么数字？它的单位是什么？**"

屏上每一个数，读者必须能就地答出三件事：**它量的是什么实体、什么维度、什么单位**。

- 轴标题 / 图名 / 直标值旁边至少有一处写清单位（条 / 万播放 / % / 人）。
- 同一屏出现多个"数量"时，各自标明量的是什么（"视频 4 条"和"线索 4 条"不能只写 4）。
- 口径（截止日 / 起算日 / 排除项）进脚注，但**单位和维度必须贴在数字旁**，不能只在脚注里。
- **动态画面里的 `0` 也必须有角色**：同一局部构图里要能看出它是轴起点、`本次 +0`、累计值还是剩余量；位置已经把它钉在轴刻度上时不用重复写“轴起点”，但不能在没有对应 mark 的地方悬一个裸 `0`。没有叙事工作的零值就隐藏；需要显示就把角色写清，不能为消灭 `0` 编一个非零值。

**自造口径必须带"怎么读"**：产物里出现你发明的口径词（窗口 / 波动倍数 / 覆盖天数 / 归一分），第一页放**逐列人话词典**（每列一句"它是什么、怎么算、大于小于意味着什么"）。原话："**窗口、窗外、干净背景，这都啥意思啊？你不能让我只看这个表就去完全理解你想要做什么。**" 列名只对发明它的人自解释。

**判据**：随机指着图上一个数，能不能不看别处就说出"这是 X 实体的 Y 维度，单位 Z"。答不出就是没标够。

---

### 图表 house 风格：直接标值取代坐标轴

认可的图表与图表库默认**相反**——不是"加了数据标签的坐标系图"，是"用直接标值替掉坐标系"：

- **每个 mark 直接标值**：柱内嵌白字值、折线每点上方标值、条形值随条。读者永远不用沿网格找轴刻度反查。
- **无刻度无网格**：只画必要的轴线。值都标了，网格线没有工作可做（Tufte：chartjunk）。
- **阈值 / 参考线画进图里**：虚线 + 行内小标签（"保底 5 万"、"拐点·净利 83 万"），**不放图例、不放脚注**，贴在几何旁边。
- **标值密度降级（多点折线的明确例外）**：数值标签超过约 12–15 个就开始互相压盖，4 系列 × 13 周 = 52 个标签必然糊成一团。这时**只标末点 + 极值 + 关键拐点，并保留一条轻量 y 轴刻度兜底**。判据：**能全标就全标、标不全就留轴，两者必居其一——不允许"既没标全、又没有轴"**，那会让读者对未标点无处可查。
- 用成熟图表库时，**mark 规格仍按本节校准**——库的默认坐标系和皮不是交付标准。

---

### 调性：高价产品的可视化必须先定调

要支撑"专业 / 高价 / 可信"的叙事（卖客户、给总部、对投资人），**廉价 AI 默认美学会直接毁掉叙事**——再准的数据也撑不起"能交付高价系统"的故事。

**AI slop 典型签名（出现即重做）**：Inter / Roboto 字体、紫色渐变、大圆角卡片、彩虹配色、chart 库默认图、居中堆叠的"仪表盘"。

**"卖得贵"的调性**：暖白纸感底 + hairline 细线分隔（不用粗边重阴影）+ 数字扫读能力（`tabular-nums` + 稳定列宽）+ 克制色 + 主色极少量点缀 + 几乎无圆角。

**做法**：先定调性再写代码；给设计方向时**给 2 个带预览的选项让用户选**，别闷头做一版。**质量优先，不以 deadline 为借口做减法。**

> 网页 / dashboard 一律**浅色主题**（终端 CLI 才深色）。原话："**这个去掉是对的，我们不要黑色的壳子。**"

---

> **阶段 4 交接检查**——走完这一阶段你手上应该有：
> 1. **实体 → 颜色映射表**（显式传给图表库，不靠它按出场顺序自动配色）；
> 2. **通道分配表**：哪个量走位置 / 长度、哪个走颜色（且颜色只编类别或阈值）。只要用了长度，再附一行渲染几何抽样：`最小正值 + 一组拉开差距的值 → 理论跨度 → 最终 painted span → 是否被 min-width / border / cap / 伪元素扩张`；
> 3. **调性对照**：列出你用的字体、圆角值、主色出现次数，逐项对照 AI slop 签名清单（Inter / Roboto、紫渐变、大圆角、彩虹配色、chart 库默认图、居中堆叠的仪表盘）。**这些都是可以写下来的清单，不是"我觉得挺克制的"。**
> 4. **有定量动画时的转场语义表**：写明 `补间 / 原子跳变 → 对象身份锚点 → 共同尺度 → 内部帧或边界帧`。命中动态因果叙事触发条件时，再写 `轨道 → 轴单位 → initialTotal` 与每个事件的 `operation / 动作 → from → +delta → to → 时间锚点 → 直接标注落点`，确认所有字段来自同一条轨道与事件；标签另含来源规模时单列 `sourceMeasure`，不得混入口径。存在跨轨 transfer 时，再交 `groupId → out / in 事件 → 同拍 → loss / conversion → 差额图内 mark` 配对表。没有定量动画时整项记「不适用」；只有纯播放/过滤/排序时只交转场语义表，不虚构因果表。
>
> **闸门对应**：闸 2（遮字自测）、闸 4（颜色体检）、闸 5（读者解码抽查）、闸 8（轴与标值扫描）、闸 9（比例与动态语义校验）。调性只在本阶段查——它是设计期决定，交付前再发现字体错了已经晚了。

---

# 阶段 5 · 交付前自检

## 交付前自检闸（9 条 · 本 skill 的脊柱）

**走这道闸的前提：先把产物真的渲染出来看。** 下面九条全部是对**渲染后的成品**提问——代码跑通不算交付，没渲染就开始填闸等于对着想象中的图作答。这一条无条件适用，不随任何豁免免除（豁免表管的是"这一条要不要答"，不管"要不要先看图"）。

**这是 DO-CONFIRM 清单：先按上面的规则做完，然后停在「要把产物交出去」这个点，逐条确认。** 每条都要求一个**可观察的产物**，不是自我评价——「我觉得这图挺清楚」无法被判失败，「数一下有几个颜色」可以。

逐条写下答案，写不出来的那条就是没过：

1. **定位 + 逐图结论句**
   先答产物级两问：**受众是谁（汇报 / 操盘）→ 形态匹配吗（静态结论图 / 交互工具）？北极星是哪个指标 → 视觉上最突出的是它吗？**
   再为每张图写下「读者应得出 ___」（**操作型产物**——界面 / 工作台 / 告警台——用变体「读者看完应该知道下一步做 ___」，见阶段 3）。**写不出的图删掉**（装饰图表形象例外：答不出不由你删，呈 owner 拍板——拍板保留的在结论句清单尾单列一行「装饰形象 · 已呈 owner · 保留」，不计入图数与句数）。结论句里若含因果（「A 带来 B」），必须同时标出依据。
   **每句结论后面必须跟一句"所以受众该做 ___"**——写得出语法完整却挂不上任何动作的句子（"发布量稳定在 29–42"）字面能过闸，但那张图该删。这是正文 so-what → now-what 判据的产物形式：**闸只要求句子存在是不够的，要求它指向一个动作。**
   最后答一句**产物级**的：**本期最该被注意的一件事是什么 → 它在哪张图上被显式标出来了？**（**产物没有时间周期概念时**——架构图 / SOP 流程图 / 合规留档这类常青产物——"本期"读作"**本次产出**"：这份东西里最该被注意的一件事。**别为了满足格式硬凑一句**，凑出来的空心头条恰好违背这条规则要防的东西。）（标注、大字、圈注、单独一行结论——不是"它的数据在某张图里"，是"读者一眼会看到它"。）
   **逐图结论句齐全 ≠ 产物有结论**：每张图各说各的，读者仍要自己拼。**最重要的那件事恰恰最容易埋在色块里**——真实读者是一格一格抠着看才发现"发得最多的那家线索挂零"的，而那是全页最大的事。
   **产物不含任何量化指标时**（纯定性流程图 / 状态示意），北极星一项记「不适用：纯定性产物无量化指标」——**受众 + 形态与结论句仍必填**。这是北极星一项唯一的豁免，写在这里是因为豁免表从第 2 条起。
   （产物：受众 + 形态判定一行、北极星一行、结论句清单且图数 = 句数、**本期头条一行 + 它被标在哪**）

2. **遮字自测**
   **先真的把文字遮掉**（渲染一版隐藏文字图层的截图，或关掉所有 label），**再从那张图上读**出具体关系，最后**逐条与第 1 条的结论句比对**——结论句里有、而遮字后读不出的，那张图没做到可视化。
   **凭记忆或凭数据写清单不算**（和第 9 条「从生成代码里读不算」是同一个口子）：作者知道 A>B，但两根条几乎等长时差异只活在标签里，遮掉就读不出，而糊弄者照写不误。
   **拿不到源码、只有成品位图时的合法降级**（这条给它名分，否则诚实的人无路可走、只能被逼着凭记忆填）：**不重渲染，改为只看几何、完全不读任何标签**——手遮住 / 裁掉文字区域也行——然后照样从形状读关系、照样与结论句逐条比对，并写明"降级原因：只有成品位图，无源码可重渲染"。**降级的是取图方式，不是"读"这个动作**：仍然必须真的看着图读，凭记忆或凭数据写清单始终不算。
   **遮字测的是「关系结构」，不测「身份」**：谁是谁由颜色 / 位置锚定即可。定性 / 几何图读的是**结构关系**（顺序、方向、分支、强调），不是数值比较。对动态因果图，本闸只检查隐藏全部文字后仍可读的**量级、顺序与区间结构**，不要求说出动作名；闸 9 另做一张**只遮外部叙述、保留图内直接标注**的截图，专门检查动作身份与区间绑定。两张证据职责不同，不得用同一张截图冒充。
   （产物：遮字截图 + 从截图上读出的关系清单 + 与结论句的逐条对照，三样齐备）

3. **观众视角两两比对**
   把所有**图和表**列出来，逐对问「观众会觉得这两个在讲同一件事吗？」（图与表讲同一批数字同样算重复。）
   **判「否」的也要写出凭什么不同**（"图 1 是指标 A 的趋势、图 2 是指标 B，不同的量"）——一排光秃秃的「否」形式上合规、信息量为零，这是本闸唯一能机械填过的一条。
   **判「是同一个量」的，还要多做一步算术：两处的数字对得上吗？** 对不上就是硬 bug，不是脚注能救的——真实读者遇到过上半页"每周共 30 来条"、下半页"本周 78 条"，他的反应是"**我对这页所有数字都会打折扣**"。同时核一遍口径：全产物的截止日、周期定义、数据来源各只有一套吗？
   **触发这一步的机械条件**：同一数字在同一产物里出现 ≥2 处（hero、正文、读出句、缺口条都算）就必须可互查——要么由生成脚本单点产出或断言，要么在本闸产物里留下逐处比对记录。两处都靠手写的同一个数，没有任何东西会反驳它（2026-09-17：「5 笔测试单」手写进四处、未进生成脚本断言，连过两轮审阅，直到验收员独立枚举才抓出实为 6 笔）。
   **顺带每张图答一句：它的图型回答的是哪类问题**（part-to-whole / 比较各系列 / 看趋势 / 看分布 / 看相关），**读者要做的是不是那类？** 不是就换图型。**这一问必须在这里问**——闸 8 只查轴、闸 9 只查比例，堆叠拿来比较各系列可以从那两条闸底下全绿走过去，而那恰是被点名最狠的一种错。
   （产物：两两清单 + 每对的判定与一句理由 + **同量两处的数字比对**一行 + **每张图是否都遵守了阶段 2 定下的那三个值**（不遵守的列出来）+ **每图一行「图型 → 它答的问题 → 读者要的问题」**）

4. **颜色体检**
   实体→颜色映射表存在吗？所有图都引用它了吗？同一实体在每张图里**颜色、位置、排序**一致吗？每张图的**类别色数 ≤ 8**？
   **语义方向对吗——告警红只出现在负向上吗？** 好 / 坏、涨 / 跌的色向全产物一致吗？
   **四个子问题各自判、可分别记不适用**：产物只有一张图 → 映射表与跨图一致两项不适用；无类别色 → 色数一项不适用；**语义色方向这一项只要产物用了任何红 / 绿 / 琥珀语义色就必答**，没用则记「无语义色」。
   **红绿之外有第二通道吗**——每个靠颜色区分状态的地方，形状 / 位置 / 文字 / 明度差至少还占一个？
   （产物：映射表本身 + 每图类别色数 + 一句「告警色只用在 ___」+ 一句「状态的第二通道是 ___」）

5. **读者解码抽查**
   随机抽查**最多 3 个**屏上的数；少于 3 个就全部检查。每个写出「这是 X 实体的 Y 维度，单位 Z」，答不出就是没标够。
   动态画面出现裸 `0`、current / target 或 delta / total 时，抽查里至少一次必须点中这类容易混淆的数字；除非它是位置明确的轴刻度，否则解码句必须说出它在当前状态里的角色。
   产物里若出现**自造口径词**（窗口 / 覆盖天数 / 归一分之类），第一页有没有逐列人话词典？
   **自造的视觉编码同样要能解码**——你发明的明度深浅 / 虚实线 / 网点填充 / 半透明代表什么？图上有没有说？（真实战例：一根柱变浅表示"这周数据不完整"，图例零解释，读者第一反应是"这是另一组实体吗"。）**判据：凡不是"颜色=类别、长度=量"这种通用约定的编码，都要就地写出它的含义。**
   （产物：最多 3 组解码句；不足 3 个数字时全量解码 + 词典页存在与否）

6. **聚合与归因体检**
   每个聚合数：**用途是什么（典型值 / 推总量）→ 据此选了 mean 还是 median？mean 与 median 背离查过吗？** 分层检查做过吗、方向一致吗、口径可比吗？
   **凡按时间合计的数**（本周共 X 条 / 本月合计）：**top-2 时点占了合计的多少？** 过半 = 脉冲不是稳态，图上要让这件事可见。
   **凡声称转化 / 归因的图**（漏斗、转化率、「A 带来 B」）：支撑这条链路的数据**真的存在**吗？不存在就降级为弱关联或砍掉。
   （产物：每个聚合数一行「用途 → 统计量 → 分层结果」；**时间合计数另加一行「top-2 时点 / 合计 = __%」**；**若未分层，必须写「未分层 + 为什么不分 + 万一方向不一致会怎样」三样**——只写「未分层」三个字等于自首后放行）

7. **分母体检**
   每个率 / 占比：分母总数多少、其中未知多少条？未知是排除了还是显式画出来了？
   （产物：每个率写成 `分子/分母（其中未知 N 条，处理：排除 / 画出）`）

8. **轴与标值扫描**
   有混量纲双轴吗？条形的**值轴**从 0 开始吗（纵向条看 y、横向条看 x）？
   **轴本身保真吗**——时间轴 / 有序轴的刻度间隔均匀吗？（没数据的月份要留空位，不能跳过：位置也是一种量的编码，跳格等于把位置编码画成非线性。这一项对全折线图同样适用，不随闸 9 一起豁免。）
   **标值密度：要么全标值、要么保留轴刻度——二者必居其一**，不允许既没标全又没有轴。
   （产物：是 / 否 + 位置；标值策略一行）

9. **比例与动态语义校验**
   抽一张有长度编码的图，量三个 mark 的几何值与真值比，比例一致吗？标签舍入档与几何同源吗？样本必须包含**最小正值**，另含一组差距足以稳定量测的值；后者验比例，前者专门验是否被最小宽度或固定装饰撑大。
   **先做结构硬闸，再量数值**：任何 `min-width`、固定 padding / border、stroke cap、marker 或伪元素只要把可见定量 span 扩到理论区间之外，直接 FAIL；即使挑出来的大值 pair 恰好落在 lie-factor 0.95–1.05 也不能洗绿——那是整幅图的失真诊断，不是给加性底开的实现容差。装饰包含在理论区间内部、不改变最终端点则不违规。
   **量测必须锁定同一真实渲染条件**：记录 viewport、browser zoom、DPR，以共同零基线到可见末端为跨度，统一使用 CSS px。HTML 先读定量元素的 `getBoundingClientRect()`，同时审计 `box-sizing / min-width / padding / border / transform / ::before / ::after`；可见 paint 越过 DOM rect 时，以截图像素端点换算回 CSS px。SVG 先把几何端点经实际 transform 映射到屏幕，再审计 `stroke-width / linecap / marker / filter`，有外扩时同样以截图可见端点为准。DOM 端点默认允许 **0.5 CSS px** 的取整误差；截图端点默认允许 **1 device pixel ÷ DPR**，更宽容的阈值必须在量测前写明仪器原因，不能看完结果再放水。
   subpixel mark 不从截图反推精确比例：用 DOM / SVG 屏幕几何证明真实布局跨度与真值同源，再用截图确认没有共同可见底宽；把可读性移到外置标签。真 bug 常在渲染层（min-width 顶住小条、边框端帽放大小值、容器裁切）。
   **任何定量动画先做转场语义检查**：补间动画必须截 `变化前 → 严格内部帧（0 < p < 1）→ 稳定后`，第二帧不能拿结束边界冒充；核对对象身份、共同尺度与中间图形是否仍有效。原子跳变没有内部帧，改截边界前/后，并证明所有相关 mark 在同一边界切换。
   **若命中阶段 4 的动态因果叙事触发条件，再做因果同步与抽样**：在补间的严格内部帧，核对动作标签、`+delta`、区间端点与累计值是不是同一事件、同一进度；原子跳变则核对四者是否同边界切换。对每个会改变闸 1 结论/本期头条的跃迁全部取证；其余事件里若存在一组紧邻的普通跃迁，再抽一组。若不存在普通相邻组，就覆盖全部剩余事件，并记录「无普通相邻组」，不得硬凑样本。逐步播放必须能停在每个事件的稳定证据帧。然后做一次**因果遮挡测试**：遮掉标题 / 图例 / 旁栏等外部叙述，但保留图内直接标注，观众还能不能指出「哪次动作造成哪一段、总量为什么变」？不能就是没绑定。
   **结构断言与视觉抽样分工**：所有因果事件都用程序断言 `to - from = delta`；每条连续轨道断言锚点在轨道内严格有序、`first.from = initialTotal`、`events[i].from = events[i-1].to`、`events[i+1].at > events[i].at + events[i].duration`、稳定帧累计值 `= event.to`、最终累计值 `= last.to`。每个事件在 `at + duration` 有可到达的稳定 step anchor；自动播放也必须真实渲染该稳定帧。重置是显式 `operation`。每个 transfer `groupId` 必须恰好配到一条 `transfer-out` 与一条 `transfer-in`，两端 `at / duration` 相同；同单位时断言 `out.delta + in.delta + loss = 0` 且 `loss >= 0`，`loss > 0` 时必须找到同量的图内差额 mark；不同单位时必须用台账里的显式 conversion 归一后再做同一守恒断言。坐标轴 rebase 不是数据事件，不得借机改累计值。只看源码断言不能替代转场/因果截图，只看几张截图也不能替代全事件断言。
   （产物：渲染条件与量测容差一行 + 三组「真值 → 理论跨度 → 最终 painted span」，其中标出最小正值样本及其固定装饰审计；有定量动画时加转场三帧/边界对照；命中动态因果叙事时再加因果同步表 + 因果遮挡截图 + 全事件断言结果；存在跨轨 transfer 时再加配对 / 同拍 / 守恒 / 差额 mark 结果）

**这道闸不能自证绿**：第 1、3、4、5、6、7、8、9 条都要求写下具体内容或数字，写不出来就是没做——不存在「我检查过了」这个答案。

**豁免按条件判，不按图类判**（一道会误杀健康输入的闸，代价是下次整道被反射性绕过——所以豁免必须写全、且好判）：

| 条 | 什么条件下记「不适用」 |
|---|---|
| 2 | 产物是纯表格 / 无任何图形 mark（遮字后本就不剩什么可读） |
| 3 | **只有「两两比对」子项可记不适用**：本次只有一个视觉产物（仅一张图，或仅一张表）。**「逐图图型语义」子项永不豁免**——图型误用是**单张图内部**就能犯的错（一张堆叠图被拿来比较各系列），恰恰是本 skill 最担心的那个错；靠"只有一张图"把它一并豁免掉，等于给最该拦的情形开后门 |
| 4 | 只有一个实体 / 单系列，**或本次只有一张图**（都没有跨图身份可言）；无类别色时色数一项另记不适用 |
| 5 | 图上没有任何数字（纯定性几何 / 流程示意）——但**自造口径词的词典子项、以及自造视觉编码的解码子项，两者都仍要答**：定性产物同样可能有自造的状态黑话，而虚实线 / 网点 / 透明度这类自造编码**恰恰在定性图里最常见** |
| 6 | 没有任何均值 / 中位数 / 率类聚合数，且没有任何转化 / 归因声称 |
| 7 | 图里没有任何率 / 占比 |
| 8 | 无坐标轴也无条形（纯定性几何、纯 KPI 数字卡片、无轴的仪表盘……括号是举例不是穷举：**判据是"有没有轴 / 有没有条"，不是"定量还是定性"**） |
| 9 | **比例子项**：没有长度编码的 mark（全折线 / 散点 / 纯定性几何）；**转场语义子项**：没有随时间变化的定量 mark；**动态因果子项**：未命中阶段 4 的因果叙事触发条件——包括没有随时间变化的定量 mark，或只是纯时间播放 / 过滤 / 排序且没有动作标签、因果声称或操作序列把动作呈现为变化原因。动态折线只要有这类因果叙事仍必须检查。三项分别记不适用，只有三项都不适用时才整条不适用 |

**记「不适用」要写出触发的是哪个条件**（如「第 9 条比例子项不适用：全折线，无长度编码；转场语义子项不适用：静态图，无随时间变化的定量 mark；动态因果子项不适用：只表达过滤后的状态变化，无动作标签或因果声称」）——只写「不适用」三个字等于跳过。

---

# 正文之外

下面三节不属于任何阶段：一节管**返工期**（不是交付期），一节是**速查**（不重复正文），一节管**这份 skill 自己怎么长大**。

## 被批之后：退一步做系统性分析，别逐点修补

> 原话："**而不是仅仅是单个的修修补补……你必须退一步思考，系统性的分析，这里面有哪些概念？有哪些维度？有哪些实体？是怎么统计？**"
> "**你可以从上到下，从总到分去给 1~3 页。必须是系统化的展示，而不是数据的堆叠，而不是重复的啰嗦。**"

收到「这图不行」的反馈时，**默认反应不该是逐条改那几个被点名的地方**——被点名的往往是症状。

**什么时候该退一步（别对单点批评过度反应）**：被点名 **≥2 处**，或批评指向**结构**（「看不懂」「没有主线」「信息密度差」「你想给谁看」）→ 退一步重做下面三件事。单点、局部、指向某个具体值或某种颜色的批评 → 就地改那一处即可。

退一步时做这三件事：

1. **列清楚**：这个产物里有哪些**概念 / 维度 / 实体**？分别怎么统计？
2. **定总→分**：先给一张总览，再按不同的轴往下分（见 `references/visual-form-selection.md` §多视图分解）。
3. **然后才动手**改图。

**反模式**：把"修修补补"当成响应——改了被点名的三处，整体结构照旧，下一轮被批同样的问题。

---

## 反模式（出现即重做）

**这一节是速查表，不是第二份规则。** 每条只给"看到什么形态"和"去哪读判据"——同一条规则写两遍，就是一处将来会分叉的复制。**新规则不许只写在这里**：写不进任何阶段的东西，说明它没有检查点抓，按「这份 skill 怎么组织的」处理。

| 看到这个形态 | 判据在哪 |
|---|---|
| 句子 / bullet / 表格文字加个彩色边框冒充可视化 | 闸 2 遮字自测 · 阶段 3「内容不是数字时」 |
| 量级信息写成文字标签（"≥9 高频"、"4条/16条/53条"） | 阶段 3「内容不是数字时」 |
| 两列 / 网格小方块，位置不承载语义 | 阶段 3「内容不是数字时」 |
| "对比"做成并排列举、不标对方怎样 | 阶段 3「内容不是数字时」 |
| 内容本身是视觉的（成片 / 截图）却画抽象方块 | 阶段 3「内容不是数字时」 |
| 单对象多维数据摊成一排文字字段 | 阶段 3「内容不是数字时」 |
| 看图人不知道"我该干啥" | 阶段 3「内容不是数字时」§操作型产物 |
| 把取数口径 / 测量覆盖当洞察画成图 | 阶段 1「这张图想让读者得出什么结论」 |
| 没问业务意图就开做 | 阶段 1「元教训」 |
| 过程指标比业务硬指标还显眼 | 阶段 1 北极星分级 |
| 卡片堆一排看不懂的虚数字 | 阶段 1 北极星分级（删指标比加指标值钱） |
| 图名需要多个括号限定语才说得清 | 阶段 1 §标题里几个限定语 = 几件事 |
| 同一张图里的系列机制不同 | 阶段 1 §同量纲 ≠ 可同图 |
| 装饰 / hero 图里的图表形象没做删形裁定、也没呈 owner 就上线 | 阶段 1「这张图想让读者得出什么结论」装饰图 bullet（删形测试） |
| 把"未知 / 空值"当否定值算进比例 | 阶段 2 §分母未知 · 闸 7 |
| 无可靠归因却做了漏斗 / 转化率 | 阶段 2「关联要诚实」· 闸 6 |
| 用过期快照 / 不标口径 / PII 不脱敏 | 阶段 2 交接检查 |
| 堆叠图用来比较各系列趋势 | 阶段 3「图型语义」 |
| 混量纲双轴 | 阶段 3「图型语义」 |
| 桑基图右栏节点叫"转给 X"/"X 自留"这类动作短语 | 阶段 3「桑基图/流向图」判据一 |
| 桑基图里"自己对自己"的量被删除或多个实体共用一个终点 | 阶段 3「桑基图/流向图」判据二 |
| 桑基图里占比最大的类别涂成告警红 | 阶段 3「桑基图/流向图」判据三 · 阶段 4「颜色即语义」 |
| 镜头/裁剪想框住一整条桑基边再放大，缩放比例算出来恒等于 1 | 阶段 3「桑基图/流向图」判据四 |
| 图和表讲同一批数字 · 表格堆屏 | 阶段 3「一个对象只画一次」·「表格纪律」 |
| 源码比例正确，但 min-width / 边框 / 端帽 / 伪元素把小 mark 撑宽；或标签值 ≠ 最终 painted span | 阶段 4「编码通道纪律」· 闸 9 |
| 动画中间帧不是有效数据图形，或动作标签只在标题/旁栏，或标签先出现、条段/总量后一拍突跳 | 阶段 4「动态量化可视化」· 闸 9 |
| 一张图 > 8 个类别色 · 同实体跨图换色换位 | 阶段 4「颜色数量与身份」· 闸 4 |
| 正向成果用了告警红 | 阶段 4「颜色即语义」· 闸 4 |
| 相邻但含义不同的数字挨在一起 · 动态画面悬着无角色的裸 `0` · 屏上出现内部黑话 | 阶段 4「每个数字标清维度单位」· 闸 5 |
| chart 库默认样式 / Inter 字体 / 紫渐变 / 大圆角 | 阶段 4「调性」 |
| 暗色壳（网页 / dashboard） | 阶段 4「调性」 |
| 代码跑通就交付、不截图核对视觉 | 闸 9（必须从渲染后的产物上量） |

## 迭代：纠正必须当场写回

纠正**就是这个 skill 的 eval 集**，但只在它落到未来会被读到的地方时才成立。

**show, don't ask：做出真东西给他看，靠真实反馈收敛,别拿方案去问。** 矩阵图迭代 6 版、每版截图给用户看才收敛到验收通过——**描述一个方案换不来那种反馈**。

**被纠正时认真核查根因，别嘴硬**：一指出立刻认 + 分析为什么错 + 改对。（这两条和下面的写回是一套：show 拿到纠正、查根因搞清为什么、写回让它不再发生。）

- **原话照抄，不要转述**——精确的话带着校准信号，转述会把它抹平。"这个没有任何意义，你想给谁看？"教的是一条硬边界；"用户希望图表有明确目的"什么都没教。
- **当场写回，两层都改**：既改产物，也改这个 skill 的规则。只改产物 = 对未来每一次运行都不可见。
- **写回时检查这个 skill 是不是正好教了刚被禁掉的做法**——纠正常常证伪一条既有指令，留着旧的必然复发。

### 但只靠纠正会长出系统性盲区——所以要定期盲测

**这份 skill 的每一条几乎都是从一次批评反推出来的。** 这意味着它系统性地只覆盖**曾经被批过**的形态；同样致命但碰巧没被批过的，它看不见——而且**从内部永远发现不了**，因为审查它的人和写它的人共享同一份批评清单。

**盲测法**（2026-07 实测有效，一次跑出 5 条正文完全没有的规则）：

1. 拿一份**真实的、被否过的产物**（不是编的例子）；
2. 派一个 fresh-context agent，**只给图，不给这份 skill**，让它扮演真实受众（"你是委托方决策者，只想拿结论"）；
   **「只给图」的边界**：给**受众身份 + 一句业务上下文**（"四家经销商在做短视频获客"），**不给**这份 skill、不给你的设计理由、不给"我想让你发现什么"。判据是——给的是**真实读者本来就知道的**（他知道自己公司在干什么），不给的是**本该由图传达的**（谁好谁坏、该介入谁）。真实决策者不在真空里看图，把他放进真空反而不真实。
3. 问三件事：每张图你能得出什么结论 / 哪里读不懂或可疑 / 你会怎么退回去让人重做；
4. 把它报的每一条**逐条 grep 回本文件**——grep 不到的就是盲区。

**为什么必须"不给 skill"**：给了 skill 的审查者会在这份文件的框架内评价这份文件，只能验证自洽、验证不了完备。**不给 skill 的读者是唯一能独立于本文件产生判断的通道。**

**三条戒律**：① grep 判据自己会骗人（"不可比"三个字命中过三次，全是别的语境的假阳性）——**必须看上下文，并且设一组"已知覆盖"的对照项证明 grep 本身有效**——做法：从本文件里挑 3–5 条你**确信已覆盖**的具体规则（如"同一实体跨图必须同色"），用**同一套 grep 判据**去查，必须全部命中；有漏的说明判据本身有问题（大小写 / 折行 / 同义措辞），先修判据再看结论；② 盲测跑出来的缺口按上面的准入规则归位，**不许直接塞进反模式速查**；③ 每次实质改动这份 skill 之后重跑一次——盲区会随内容变化重新长出来。

> 首次盲测跑出的 5 条：末期未走完的周期与完整周期同轴、零在面积编码里不可见、全产物口径不统一、同一个量在两图里对不上、本期最大异常没被显式标出。**没有一条在原始批评清单里。**

---

## Next Step

图表判断做完之后，按产物形态交给实现层：

```
图表方案已定（图型 / 统计量 / 配色映射 / 布局）。

A) HTML 报告页 → report-with-html:report-with-html（架构、组件货架、皮、渲染自验）
B) 可编辑 PPT → deck-creator:deck-creator（python-pptx 原生图表 + 渲染陷阱）
C) 当前项目的图表栈里实现 → 用项目已声明的库，mark 规格按本 skill 的 house 风格校准
```
