技能 infographic-poster 的说明文档与示例
为什么不用 AI 生图
AI 生图做含中文和数字的图,问题不在审美,而在文字控制:中文会缺笔画、数字会多一横、标签会串行。反复重试只能碰运气。
正确做法是用 HTML 写版式,用无头浏览器渲染成 PNG。文字一字不差,位置精确到像素,改一个数字重新渲染就行,而且一张图的版式会成为下一张图的起点。
四步流程
- 数据表格化。 把要上图的每个数值写成一行:颜色、所属分组、柱子数值、X 轴标签。后面所有元素都从同一行数据生成,这是杜绝「柱子与标签串行」的根本。
- 选版式。 分类对比用分组柱状;阶层递进用分层;归因拆解用多列推力;认知转变用左右对照;单一结论用大数字。
- 写 HTML 并渲染。 以模板为起点,跑 `render.py` 得到 4K 与 1080p 两版。
- 目检。 看渲染图逐项确认:文字无乱码、数值与标签对应、比例与数据一致、无重叠裁切。不通过就改 HTML 重渲染。
视觉规范(冷眼商业风)
- 画布 1920×1080,外边距 64px;字体 Noto Sans CJK SC
- 墨色 `#15181C`,辅助 `#74797F`,分割线 1px `#E2E5E8`
- 强调色只有一个:`#C0462A`,用在主角与结论上
- 字号阶梯:主标题 48–58、副标题 22–27、正文 17–23、大数字 44–48、结论 29–30
- 禁止:背景网格线、坐标轴刻度数字、大圆角卡片、阴影、渐变
版式选择
| 内容形态 | 版式 | 关键点 | |---|---|---| | 多品类对比数值 | 分组柱状图 | 同层品类必须聚成一组,否则序列会「中间最高」 | | 阶层/漏斗/金字塔 | 分层 + 组间留白 | 层名单独成行,不要塞进 X 轴标签 | | 归因/机制拆解 | 多列推力 | 每列:序号 + 标题 + 2-3 行说明 + 一个大数字 | | 认知转变 | 左右对照 + 箭头 | 旧状态用灰,新状态用黑加粗 | | 单一结论 | 大数字 + 一句解释 | 数字 120px 以上,其余留白 |
站点发布
图做完之后,用 `build_site.py` 把图片和报告打包成带下载按钮的页面,再用 `publish.py` 推到 Cloudflare Pages。约定很简单:工作目录下成对的 `X-4k.png` 与 `X-1080.png` 会被自动识别为一张图。
已知坑
- chromium 必须加 `--disable-dev-shm-usage`,容器里常缺 `/dev/shm`
- headless 的视口高度比 `--window-size` 少约 100px,要用 1200 的高度渲染再裁到 1080
- 个位数百分比在 150% 量程里只有 10px 高,这是数据真实,不要为了好看抬高
- 区间值与下限值同轴时,柱顶要用虚线标出「这是下限」,并在注脚写明
- 结论里做除法要穷举所有配对,取真实区间,别只挑最好看的那一对
怎么调用
技能目录:`~/.aicode/skills/infographic-poster/`
- `assets/template.html` — 版式骨架
- `scripts/render.py` — HTML → 4K / 1080p PNG
- `scripts/build_site.py` — 图片画廊 + 报告页
- `scripts/publish.py` — 发布到 Cloudflare Pages
新会话中直接说「把这份内容做成一张信息图」即会命中该技能。

