data-visualization-discipline
GitHub数据可视化判断层标准,规范图表选型、统计量使用及视觉一致性,确保图表有效传达结论。
Trigger Scenarios
Install
npx skills add daymade/claude-code-skills --skill data-visualization-discipline -g -y
SKILL.md
Frontmatter
{
"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 的出处,以及这些理论互相冲突的地方 |
先读哪个:动手画图 → 直接按下面五个阶段走;内容是定性的、不知道画成什么形状 → 阶段 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、3、4 项仍必填。(这条豁免闸 1 也有;写在这里是因为这是它第一次被需要的地方,让人翻到四百行后才看到等于没写。)
- 每张计划中的图一句「读者应得出 ___」(操作型产物用变体「读者看完应该知道下一步做 ___」;计划中的"图"含装饰 / hero 图里被删形测试裁定为数据主张的图表形象——它们不会被数进"图清单",恰是最常整条绕过本检查的一类,判据见上文装饰图 bullet)。此刻还没看数据,写的是这张图要回答的决策问题("应得出四家里谁领先"),交付时由闸 1 校准成实际结论("广州领先,是第二名的 3 倍")。写不出那句话的图,在这里就删掉(唯一例外:装饰图表形象答不出不由你删——呈 owner 拍板,见装饰图 bullet)——别带着它去验数据、去选形,那些工时全是白花的。
- 对照清单:每个要上屏的数,对照物是谁(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 到底是真跌了,还是这周没过完?这直接决定我要不要去质问湖南,但我判断不了。"
三选一,没有第四种做法:
- 不画——末期不完整就不进图,图只画到最后一个完整周期;
- 画在另一根线上——不与完整周期连成同一条折线 / 同一组条形(连起来就是在邀请读者做那个不成立的比较);
- 换成可比口径——日均值、或"同口径进度对比"(本周前 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 交接检查——进入选形之前,对每个会上屏的数答四件事:
- 统计量:用途是什么(典型值 / 推总量)→ 据此选了 mean 还是 median?分母里未知多少条、怎么处理的?
- 来源与口径:这份数是此刻实时还是某天的快照?关键数字以谁的核定为准?并且:现在就把整个产物的截止日、周期定义、数据来源各定成一个值,写下来。 这一步是定规格,不是核对——图还没画,没什么可核的;它的作用是让后面每张图都有一个可遵守的对象。(真有必须不同的,此刻就写清差异从哪来。)
- 时间序列的末期完整吗:最后一个周期走完了没有?没走完就按「不画 / 另起一根线 / 换可比口径」三选一处理——不是标个浅色加个星号。
- 可发布性:含 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 替代两个独立榜"——既消重、又保住用户要的对比图。
表格纪律
原话:"表格里写这么多数字干什么啊谁能有时间看这些数字?表格里写这么多文字干什么啊谁能有时间看这些文字?"
表格的默认失败模式是"什么都塞进去让读者自己找"。
- 每列先问"有业务价值吗",没有就砍——列不是越全越好。
- 能编成图形的数值别留在表里:占比 → 条,状态 → 色徽标,评分 → 填格条。表格留给需要精确查阅的值。
- 文字单元格压到最短:状态 / 元信息标签降级成小徽标,不配独占一列。
- 挤掉空白:行高紧凑、单行显示,别让内容飘在格中央——原话:"你自己看不出来中间有一大片空白?"
- 数值列右对齐 + tabular-nums,位数对齐才能竖扫比大小;行首锚列加粗 + nowrap。
- 表头降调(小一号灰字 + 底重线)——表头是骨架不是内容。
和图重复的表格直接删:同一批数字不要既画又列。
阶段 3 交接检查——走完这一阶段你手上应该有:
- 这批实体的唯一画法(写下来那一句:N 实体 × 少属性 → 一张矩阵 / N 实体 × 时间 → 每指标一张同构趋势);
- 消重后的图与表清单;
- 每张表的列清单,每列旁边一句"它的业务价值是什么"——答不出的列在这一步砍掉,别带进编码阶段。
- 每张用面积 / 长度编码的图,零值处置是什么——先写它是否支持结论 / 动作;是,再写它的显式非长度形态与角色单位("线索数 0 条" / "补一行 ✓✗ 徽标" / "网格底色露出空格");否,写「无决策相关零值,隐藏」。
- 凡内容不是现成数字的视觉(流程 / 对比 / 清单 / 素材):写下它的量纲是什么、编成了什么几何。写不出量纲的,这一步就改回文字——别让它带着"图形容器装文字"的形态进编码阶段,那时候只会被调样式,不会被改回文字。
闸门对应:闸 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 交接检查——走完这一阶段你手上应该有:
- 实体 → 颜色映射表(显式传给图表库,不靠它按出场顺序自动配色);
- 通道分配表:哪个量走位置 / 长度、哪个走颜色(且颜色只编类别或阈值)。只要用了长度,再附一行渲染几何抽样:
最小正值 + 一组拉开差距的值 → 理论跨度 → 最终 painted span → 是否被 min-width / border / cap / 伪元素扩张;- 调性对照:列出你用的字体、圆角值、主色出现次数,逐项对照 AI slop 签名清单(Inter / Roboto、紫渐变、大圆角、彩虹配色、chart 库默认图、居中堆叠的仪表盘)。这些都是可以写下来的清单,不是"我觉得挺克制的"。
- 有定量动画时的转场语义表:写明
补间 / 原子跳变 → 对象身份锚点 → 共同尺度 → 内部帧或边界帧。命中动态因果叙事触发条件时,再写轨道 → 轴单位 → initialTotal与每个事件的operation / 动作 → from → +delta → to → 时间锚点 → 直接标注落点,确认所有字段来自同一条轨道与事件;标签另含来源规模时单列sourceMeasure,不得混入口径。存在跨轨 transfer 时,再交groupId → out / in 事件 → 同拍 → loss / conversion → 差额图内 mark配对表。没有定量动画时整项记「不适用」;只有纯播放/过滤/排序时只交转场语义表,不虚构因果表。闸门对应:闸 2(遮字自测)、闸 4(颜色体检)、闸 5(读者解码抽查)、闸 8(轴与标值扫描)、闸 9(比例与动态语义校验)。调性只在本阶段查——它是设计期决定,交付前再发现字体错了已经晚了。
阶段 5 · 交付前自检
交付前自检闸(9 条 · 本 skill 的脊柱)
走这道闸的前提:先把产物真的渲染出来看。 下面九条全部是对渲染后的成品提问——代码跑通不算交付,没渲染就开始填闸等于对着想象中的图作答。这一条无条件适用,不随任何豁免免除(豁免表管的是"这一条要不要答",不管"要不要先看图")。
这是 DO-CONFIRM 清单:先按上面的规则做完,然后停在「要把产物交出去」这个点,逐条确认。 每条都要求一个可观察的产物,不是自我评价——「我觉得这图挺清楚」无法被判失败,「数一下有几个颜色」可以。
逐条写下答案,写不出来的那条就是没过:
-
定位 + 逐图结论句 先答产物级两问:受众是谁(汇报 / 操盘)→ 形态匹配吗(静态结论图 / 交互工具)?北极星是哪个指标 → 视觉上最突出的是它吗? 再为每张图写下「读者应得出 ___」(操作型产物——界面 / 工作台 / 告警台——用变体「读者看完应该知道下一步做 ___」,见阶段 3)。写不出的图删掉(装饰图表形象例外:答不出不由你删,呈 owner 拍板——拍板保留的在结论句清单尾单列一行「装饰形象 · 已呈 owner · 保留」,不计入图数与句数)。结论句里若含因果(「A 带来 B」),必须同时标出依据。 每句结论后面必须跟一句"所以受众该做 ___"——写得出语法完整却挂不上任何动作的句子("发布量稳定在 29–42")字面能过闸,但那张图该删。这是正文 so-what → now-what 判据的产物形式:闸只要求句子存在是不够的,要求它指向一个动作。 最后答一句产物级的:本期最该被注意的一件事是什么 → 它在哪张图上被显式标出来了?(产物没有时间周期概念时——架构图 / SOP 流程图 / 合规留档这类常青产物——"本期"读作"本次产出":这份东西里最该被注意的一件事。别为了满足格式硬凑一句,凑出来的空心头条恰好违背这条规则要防的东西。)(标注、大字、圈注、单独一行结论——不是"它的数据在某张图里",是"读者一眼会看到它"。) 逐图结论句齐全 ≠ 产物有结论:每张图各说各的,读者仍要自己拼。最重要的那件事恰恰最容易埋在色块里——真实读者是一格一格抠着看才发现"发得最多的那家线索挂零"的,而那是全页最大的事。 产物不含任何量化指标时(纯定性流程图 / 状态示意),北极星一项记「不适用:纯定性产物无量化指标」——受众 + 形态与结论句仍必填。这是北极星一项唯一的豁免,写在这里是因为豁免表从第 2 条起。 (产物:受众 + 形态判定一行、北极星一行、结论句清单且图数 = 句数、本期头条一行 + 它被标在哪)
-
遮字自测 先真的把文字遮掉(渲染一版隐藏文字图层的截图,或关掉所有 label),再从那张图上读出具体关系,最后逐条与第 1 条的结论句比对——结论句里有、而遮字后读不出的,那张图没做到可视化。 凭记忆或凭数据写清单不算(和第 9 条「从生成代码里读不算」是同一个口子):作者知道 A>B,但两根条几乎等长时差异只活在标签里,遮掉就读不出,而糊弄者照写不误。 拿不到源码、只有成品位图时的合法降级(这条给它名分,否则诚实的人无路可走、只能被逼着凭记忆填):不重渲染,改为只看几何、完全不读任何标签——手遮住 / 裁掉文字区域也行——然后照样从形状读关系、照样与结论句逐条比对,并写明"降级原因:只有成品位图,无源码可重渲染"。降级的是取图方式,不是"读"这个动作:仍然必须真的看着图读,凭记忆或凭数据写清单始终不算。 遮字测的是「关系结构」,不测「身份」:谁是谁由颜色 / 位置锚定即可。定性 / 几何图读的是结构关系(顺序、方向、分支、强调),不是数值比较。对动态因果图,本闸只检查隐藏全部文字后仍可读的量级、顺序与区间结构,不要求说出动作名;闸 9 另做一张只遮外部叙述、保留图内直接标注的截图,专门检查动作身份与区间绑定。两张证据职责不同,不得用同一张截图冒充。 (产物:遮字截图 + 从截图上读出的关系清单 + 与结论句的逐条对照,三样齐备)
-
观众视角两两比对 把所有图和表列出来,逐对问「观众会觉得这两个在讲同一件事吗?」(图与表讲同一批数字同样算重复。) 判「否」的也要写出凭什么不同("图 1 是指标 A 的趋势、图 2 是指标 B,不同的量")——一排光秃秃的「否」形式上合规、信息量为零,这是本闸唯一能机械填过的一条。 判「是同一个量」的,还要多做一步算术:两处的数字对得上吗? 对不上就是硬 bug,不是脚注能救的——真实读者遇到过上半页"每周共 30 来条"、下半页"本周 78 条",他的反应是"我对这页所有数字都会打折扣"。同时核一遍口径:全产物的截止日、周期定义、数据来源各只有一套吗? 触发这一步的机械条件:同一数字在同一产物里出现 ≥2 处(hero、正文、读出句、缺口条都算)就必须可互查——要么由生成脚本单点产出或断言,要么在本闸产物里留下逐处比对记录。两处都靠手写的同一个数,没有任何东西会反驳它(2026-09-17:「5 笔测试单」手写进四处、未进生成脚本断言,连过两轮审阅,直到验收员独立枚举才抓出实为 6 笔)。 顺带每张图答一句:它的图型回答的是哪类问题(part-to-whole / 比较各系列 / 看趋势 / 看分布 / 看相关),读者要做的是不是那类? 不是就换图型。这一问必须在这里问——闸 8 只查轴、闸 9 只查比例,堆叠拿来比较各系列可以从那两条闸底下全绿走过去,而那恰是被点名最狠的一种错。 (产物:两两清单 + 每对的判定与一句理由 + 同量两处的数字比对一行 + 每张图是否都遵守了阶段 2 定下的那三个值(不遵守的列出来)+ 每图一行「图型 → 它答的问题 → 读者要的问题」)
-
颜色体检 实体→颜色映射表存在吗?所有图都引用它了吗?同一实体在每张图里颜色、位置、排序一致吗?每张图的类别色数 ≤ 8? 语义方向对吗——告警红只出现在负向上吗? 好 / 坏、涨 / 跌的色向全产物一致吗? 四个子问题各自判、可分别记不适用:产物只有一张图 → 映射表与跨图一致两项不适用;无类别色 → 色数一项不适用;语义色方向这一项只要产物用了任何红 / 绿 / 琥珀语义色就必答,没用则记「无语义色」。 红绿之外有第二通道吗——每个靠颜色区分状态的地方,形状 / 位置 / 文字 / 明度差至少还占一个? (产物:映射表本身 + 每图类别色数 + 一句「告警色只用在 ___」+ 一句「状态的第二通道是 ___」)
-
读者解码抽查 随机抽查最多 3 个屏上的数;少于 3 个就全部检查。每个写出「这是 X 实体的 Y 维度,单位 Z」,答不出就是没标够。 动态画面出现裸
0、current / target 或 delta / total 时,抽查里至少一次必须点中这类容易混淆的数字;除非它是位置明确的轴刻度,否则解码句必须说出它在当前状态里的角色。 产物里若出现自造口径词(窗口 / 覆盖天数 / 归一分之类),第一页有没有逐列人话词典? 自造的视觉编码同样要能解码——你发明的明度深浅 / 虚实线 / 网点填充 / 半透明代表什么?图上有没有说?(真实战例:一根柱变浅表示"这周数据不完整",图例零解释,读者第一反应是"这是另一组实体吗"。)判据:凡不是"颜色=类别、长度=量"这种通用约定的编码,都要就地写出它的含义。 (产物:最多 3 组解码句;不足 3 个数字时全量解码 + 词典页存在与否) -
聚合与归因体检 每个聚合数:用途是什么(典型值 / 推总量)→ 据此选了 mean 还是 median?mean 与 median 背离查过吗? 分层检查做过吗、方向一致吗、口径可比吗? 凡按时间合计的数(本周共 X 条 / 本月合计):top-2 时点占了合计的多少? 过半 = 脉冲不是稳态,图上要让这件事可见。 凡声称转化 / 归因的图(漏斗、转化率、「A 带来 B」):支撑这条链路的数据真的存在吗?不存在就降级为弱关联或砍掉。 (产物:每个聚合数一行「用途 → 统计量 → 分层结果」;时间合计数另加一行「top-2 时点 / 合计 = __%」;若未分层,必须写「未分层 + 为什么不分 + 万一方向不一致会怎样」三样——只写「未分层」三个字等于自首后放行)
-
分母体检 每个率 / 占比:分母总数多少、其中未知多少条?未知是排除了还是显式画出来了? (产物:每个率写成
分子/分母(其中未知 N 条,处理:排除 / 画出)) -
轴与标值扫描 有混量纲双轴吗?条形的值轴从 0 开始吗(纵向条看 y、横向条看 x)? 轴本身保真吗——时间轴 / 有序轴的刻度间隔均匀吗?(没数据的月份要留空位,不能跳过:位置也是一种量的编码,跳格等于把位置编码画成非线性。这一项对全折线图同样适用,不随闸 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。每个 transfergroupId必须恰好配到一条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 处,或批评指向结构(「看不懂」「没有主线」「信息密度差」「你想给谁看」)→ 退一步重做下面三件事。单点、局部、指向某个具体值或某种颜色的批评 → 就地改那一处即可。
退一步时做这三件事:
- 列清楚:这个产物里有哪些概念 / 维度 / 实体?分别怎么统计?
- 定总→分:先给一张总览,再按不同的轴往下分(见
references/visual-form-selection.md§多视图分解)。 - 然后才动手改图。
反模式:把"修修补补"当成响应——改了被点名的三处,整体结构照旧,下一轮被批同样的问题。
反模式(出现即重做)
这一节是速查表,不是第二份规则。 每条只给"看到什么形态"和"去哪读判据"——同一条规则写两遍,就是一处将来会分叉的复制。新规则不许只写在这里:写不进任何阶段的东西,说明它没有检查点抓,按「这份 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 条正文完全没有的规则):
- 拿一份真实的、被否过的产物(不是编的例子);
- 派一个 fresh-context agent,只给图,不给这份 skill,让它扮演真实受众("你是委托方决策者,只想拿结论"); 「只给图」的边界:给受众身份 + 一句业务上下文("四家经销商在做短视频获客"),不给这份 skill、不给你的设计理由、不给"我想让你发现什么"。判据是——给的是真实读者本来就知道的(他知道自己公司在干什么),不给的是本该由图传达的(谁好谁坏、该介入谁)。真实决策者不在真空里看图,把他放进真空反而不真实。
- 问三件事:每张图你能得出什么结论 / 哪里读不懂或可疑 / 你会怎么退回去让人重做;
- 把它报的每一条逐条 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 风格校准
Version History
- c6903aa Current 2026-09-28 12:33


