CtrlK
BlogDocsLog inGet started
Tessl Logo

data-visualization-discipline

数据可视化的判断层 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)。

70

Quality

86%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

SKILL.md
Quality
Evals
Security

数据可视化纪律

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

边界:什么归我,什么不归我

问题归属
这张图想让读者得出什么结论?该用什么图型?用均值还是中位数?能不能聚合?几个颜色?本 skill
报告页怎么排、用哪个组件、什么皮、交互键位、浏览器渲染自验、认可语料 registerreport-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. 受众 × 形态一句:汇报(→ 静态结论图)还是操盘(→ 交互工具)?
  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 替代两个独立榜"——既消重、又保住用户要的对比图。


表格纪律

原话:"表格里写这么多数字干什么啊谁能有时间看这些数字?表格里写这么多文字干什么啊谁能有时间看这些文字?"

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

  • 每列先问"有业务价值吗",没有就砍——列不是越全越好。
  • 能编成图形的数值别留在表里:占比 → 条,状态 → 色徽标,评分 → 填格条。表格留给需要精确查阅的值。
  • 文字单元格压到最短:状态 / 元信息标签降级成小徽标,不配独占一列。
  • 挤掉空白:行高紧凑、单行显示,别让内容飘在格中央——原话:"你自己看不出来中间有一大片空白?"
  • 数值列右对齐 + 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 风格校准
Repository
daymade/claude-code-skills
Last updated
First committed

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.