thesis-figures — 本论文统一画图入口
定位:本论文统一画图入口,thesis-analyze / thesis-defense 等图表需求均路由到此。 适用范围:本 MEM 论文(浙大 zjuthesis,黑白打印送审)的全部插图工作——新建、修改、重渲、改造为可编辑格式。 既有基础设施(必须复用,不另起炉灶):
zjuthesis/figures/FIGURES.md(图↔源↔数据对照清单)、figures/rebuild_all.sh(一键重建)、figures/src/(全部图源)、figures/src/crop.py(TikZ 裁切)。
0. 第一问:这张图要论证什么?(吸收自 scipilot 第 0 步)
任何画图请求,先回答两个问题再动手:
- 这张图要支撑正文哪个结论? 同一批数据,论点不同图型就不同(对比改进前后→斜率图/成对柱;占比结构→帕累托/横向柱;趋势→折线;权重结构→雷达/树)。用户没说清就问一句,或从章节上下文推断并明确说出你的假设。
- 数据在正文哪张表? 本论文铁律:只可视化论文已有表格的真实数据。没有对应表格/正文数字的图一律不画;聚类没有原始点坐标就不画散点。这一条同时替代了 scipilot 的
profile_data.py数据剖析步——本论文的"数据剖析"就是打开对应正文表格逐个核对数字,并查FIGURES.md确认依赖关系。
一图一论点(scipilot P12):一张图塞不下就拆图,不硬塞。
1. 适用判断树(三条技术路线)
用户要画/改一张图
│
├─ ① 数据图表(柱/折线/散点/帕累托/雷达/甘特/回归系数CI/LDA占比…)
│ → R/ggplot2 路线(§2)。执行后端 = 全局 nature-figure skill
│ (~/ai-skills/nature-skills/skills/nature-figure/,选 backend=r),
│ 本 skill 提供论文级约束与验收闭环。**若未装 nature-figure**,直接用本 skill 附带
│ scripts/templates/*.R 骨架(自带黑白主题+跨平台中文字体+双导出,零外部依赖)。
│ 现有实例:fig_pareto / fig_kano / fig_regression / fig_perf_progress /
│ fig_gantt / fig_lda / fig_scheme(源在 figures/src/*.R)
│
├─ ② 流程图/架构图/示意图(鱼骨/KJ亲和/技术路线/指标体系树/前后对比示意/趋势标注图)
│ → LaTeX TikZ 路线(§3)。standalone 编译 + crop.py 裁切。
│ 现有实例:fig_fishbone / fig_kj / fig_beforeafter / fig_trend / fig_radar
│ (源在 figures/src/*.tex);技术路线图/指标树为章节内联 TikZ,随正文编译。
│ scipilot 明确不做这类图("不做示意图、流程图、架构图")——此路线是本
│ skill 相对 scipilot 的独有覆盖。
│
└─ ③ 需要"可编辑成品"(放进 PPT 手工改 / 把外部位图·PDF 变矢量 / Figma·Inkscape 编辑)
→ mac-editable-figure 路线(§4)。直接调用 S/mac-editable-figure,
本 skill 只做路由:
- 已有矢量 PDF → pdf2svg 无损转 SVG(首选)
- 位图/截图/AI图 → LLM 视觉重建为 SVG/TikZ/Mermaid(结构图最准)
或 vtracer 自动矢量化(色块最准)
- 改完 rsvg-convert 导回 PDF(LaTeX)/PNG 300dpi(DOCX/PPT)
路线选择速判:图里的核心是"数值→几何映射"(轴/刻度/图例)→ ①;核心是"框和箭头+文字"→ ②;输入已是成品图、目的是"让它可改"→ ③。答辩 PPT 要用论文里的图:直接用现成 figures/*.png(300dpi)即可,只有需要在 PPT 里改文字/配色时才走 ③。
2. R/ggplot2 数据图路线
2.1 环境(本机已踩坑验证,照抄勿改)
- 安装:
HOMEBREW_NO_AUTO_UPDATE=1 brew install r(清华镜像 auto-update 会卡死十几分钟;已卡死则pkill -f "mirrors.tuna"再装)。 - Homebrew R 是源码版:
install.packages不带type="binary"(报 not supported),走源码编译约 2 分钟。 - 包:
ggplot2 patchwork showtext sysfonts,CRAN 镜像https://mirrors.tuna.tsinghua.edu.cn/CRAN/。 - 中文字体固定为:
font_add("cn","/System/Library/Fonts/STHeiti Medium.ttc"); showtext_auto()。不采用 scipilot 的 Noto/SimHei 优先级链——本论文全部既有图用 STHeiti,换字体会造成图间不一致。跨平台复用见scripts/templates/_common.R的cn_font()自动探测(macOS STHeiti / Linux Noto·文泉驿,WENQU_CN_FONT可覆盖;同一论文内字体保持一致即可)。 - 导出:
cairo_pdf(LaTeX 用)+ggsave(..., dpi=300)PNG(DOCX 用)。
2.2 选图速查(吸收自 scipilot chart_selection,按本论文场景裁剪)
| 数据形态(本论文典型) | 首选 | 不该用 |
|---|---|---|
| 分类占比/主次排序(缺陷分类、LDA 主题) | 横向/纵向柱按值降序;主次分析用帕累托(柱+累计线) | 饼图(人眼判角度差长度 3 倍) |
| 改进前后对照(多指标) | 成对柱/斜率图/雷达(≤8 维) | 3D 柱 |
| 月度趋势 | 折线(不同指标靠线型+标记区分) | 堆叠面积 |
| 回归系数 | 系数点 + 95%CI 横线(横向排布更易读) | 只给表不给图 |
| 时间计划 | 甘特 | — |
| x 是分类 | 点/柱 | 折线连均值(暗示不存在的连续关系,scipilot P6) |
2.3 主动拦截清单(吸收自 scipilot"顾问职责",先说明再给替代,不默默照做)
| 触发 | 问题 | 替代 |
|---|---|---|
| 双 Y 轴放两个无关变量 | 视觉相关是作图者捏造的 | 拆上下子图共享 x;或标准化共轴。例外:fig_trend 已有左右轴(率% vs 时延),保留但必须双侧轴标签+图注注明口径 |
| 比例/率的 Y 轴不从 0 起 | 小差异被放大误导 | 从 0 起;确需截断则明示断裂标记并在图注说明 |
| 饼图/3D 图 | 感知失真 | 横向柱按值排序 |
| rainbow/jet 连续色图 | 感知不均匀、灰度打印全糊 | 灰度渐变或 viridis(并过 §5 灰度验收) |
| 图里出现正文/表格里找不到的数字 | 编造数据,零容忍 | 停手,回正文找表;找不到就不画 |
| 一图多论点、分组组合过多 | 没论点 | 拆图 |
不采纳 scipilot 的"n<10 均值柱→箱线+stripplot"拦截为强制项:本论文数据是系统埋点全量指标与已汇总表格值,不是原始样本点,无 stripplot 可叠;该条降级为"若未来出现小样本原始数据图再启用"。
2.4 误差/统计交代(吸收自 scipilot 原则 5,适配本论文)
凡带 CI/误差棒的图(如 fig_regression 的 β±95%CI),图注必须写清:区间类型(95%CI)、N、来源表号;统计量一律取自 stats/ 脚本派生值(如 regression_stats.py),禁止为画图手算或补造 SE/CI。
3. TikZ 流程/架构图路线
(本节收编 mgmt-paper-diagrams 的核心独有价值)
standalone 紧裁模板(避免大画布反模式):
\documentclass[border=6pt]{standalone} \usepackage{ctex}\usepackage{tikz} \begin{document}\begin{tikzpicture} ... \end{tikzpicture}\end{document}不要用
geometry paperwidth=40cm大画布——图占一角,\includegraphics整块缩小四周留白。诊断:pdfinfo fig.pdf | grep 'Page size'。裁切降级链:
pdfcrop→gs -sDEVICE=bbox→ PyMuPDF 像素级兜底。本项目已固化为figures/src/crop.py,直接用它,不重写。风格与图 1.1 技术路线图统一:黑白、矩形无填充、虚线分组、不用间隔号
·(AI 痕迹清单 A 类);框内只放通用概念词,不放具体数字/算法名/统计名。内联 TikZ(技术路线图、指标体系树、Ch4 流程图)源码在章节
.tex里,改章节即改图,无需单独重渲。草图阶段可用 Mermaid 快速对结构(mgmt-paper-diagrams 的"先 Mermaid 草图→定稿改 TikZ"两段法),但定稿必须是 TikZ(与正文字体一致、矢量、可进 rebuild_all.sh)。
4. 可编辑改造路线(→ mac-editable-figure,保留不收编)
该 skill 有本 skill 不重复的独立工具链(pdf2svg / vtracer / potrace / rsvg-convert / LLM 视觉重建 + scripts/figtool.sh + 独立 venv),涉及 PPT 可编辑、外部图矢量化时直接调用 S/mac-editable-figure。其重建铁律与本 skill 一致:只复刻可见结构与文字,不臆造数据。
5. 论文铁律(全收编,任何路线都必须过)
- 真实数据:只可视化论文已有表格的真实数据,严禁为画图编造任何统计量/坐标。改图先对表,对不上先改正文或停手。
- 黑白/灰度打印优先(硬约束):学位论文按黑白打印送审,默认黑白灰 + 明度/线型/标记/填充纹理区分,与图 1.1 黑白路线图风格统一。彩色仅在确认最终打印/提交方式支持彩色后才允许使用,且启用彩色时仍须通过灰度预览验收(转灰后各系列可分)。灰度预览做法(吸收自 scipilot
grayscale_preview思路,本地实现):magick fig_x.png -colorspace Gray fig_x_gray.png后 Read 目视。色盲友好性由"灰度可分"自然覆盖,不单独引入 Okabe-Ito 彩板为默认。
灰度分离度定量验收(比目视更早抓"打印糊"):python3 scripts/print_check.py(PIL+numpy,扫 zjuthesis/figures/*.png)。判据三条:①相邻填充灰阶明度差 ≥51/255(20%)安全,38–51 偏近、<38 半调打印易糊——屏幕发光能分的灰,激光打印机靠网点抖动模拟灰度,明度差太小会糊成一团;②大面积中灰(80–180)占比 >18% 报网点颗粒(打印/复印发麻,装饰性瑕疵);③残余彩色扫描(防"两条不同色但明度相近的线,转黑白塌成同一个灰")。关键认知:灰度≠打印不糊,"是不是彩色"(饱和度扫描)和"灰阶够不够分得开"(本脚本)是两件事;线条图靠形状/位置/线型区分、不受明度差限(脚本报 999=检不到填充灰阶即线条图),填充类图才重点看明度差与网点面积。全部图源改灰度后必跑一次。
3. 双格式导出:每图必出 figures/fig_*.pdf(LaTeX \includegraphics)+ figures/fig_*.png(DOCX/PPT,300dpi)。矢量优先,绝不 JPEG(scipilot 原则 2,与本地实践一致)。
4. 中文渲染:R 用 showtext + STHeiti;TikZ 用 ctex。出图后目视确认无方框缺字。
5. 图源可复现 + FIGURES.md 登记:新图必须有源脚本入 figures/src/(R 或 TikZ),并在 figures/FIGURES.md 增行(图名/源/类型/关键数据/依赖表/重渲命令),接入 rebuild_all.sh。不得手改成品 pdf/png。改正文数字→查 FIGURES.md→重渲受影响图→grep 旧值 清零(对应记忆铁律"改数字先查 FIGURES.md 重渲图")。
6. 目视 PNG 验收(视觉自检闭环):出图后必须用 Read 读 PNG 逐项核对,发现问题回改源脚本重渲,直到通过。核对清单(本地"必目视"实践 + scipilot visual_review 8 项合并):
- 无缺字/乱码方框(含负号);
- 文字无越界裁切、刻度标签无重叠(历史真实案例:帕累托首柱标签被累计点遮挡、鱼骨图肋骨文字重叠——编译无报错、肉眼可见);
- 图例不压数据;多面板对齐;
- 灰度下各系列可分(见铁律 2);
- 图中每个数字与正文/表格同值。
- 按最终尺寸出图,不二次缩放(scipilot 原则 1,采纳):R 图
ggsave直接设论文实际宽度(正文满栏约 15cm/6in),字号按最终尺寸可读(标签≥8pt 观感);TikZ 图\resizebox{\textwidth}{!}仅用于本就按比例设计的路线图,数据图不得靠 LaTeX 大幅缩放补救。 - 图注规范(收编自 mgmt-paper-publication-figures):图题中文置于图下、表题置于表上;需要说明口径/来源时以"注:"另起;率与时延双轴等特殊口径必须注明(如率/时延双轴须加口径注)。
- AI 痕迹:图内文字同样过 AI 痕迹清单——不用间隔号
·、不用破折号插语、中文标点统一。 - 题注中英双语 + 一致性机制(若学校规范要求图题/表题双语):只题注双语、图表内部文字保持中文(规范要的是"图题/表题双语",非图内文字)。唯一合法写法
\caption[中文标题]{中文标题 \\ English Title}——可选参数[中文]进目录(只中文),主参数"中文\\英文"正文双行。英文 Title-Case 名词短语无句点、术语与英文摘要一致、数学记号原样保留。一致性铁律(中文为唯一事实源):改题注必须在同一个\caption里中英一起改;改完跑scripts/check_captions.py(设THESIS_ROOT为论文编译根)——纯 grep+hash、零 LLM key、只诊断不误改手工润色的英文,报"缺英文/目录参数不符/中文改了英文可能过时"(靠figures/CAPTIONS.md中文 hash 比对),补齐后--update刷新基准。
6. scipilot-figure-skill 采纳/不采清单
来源:GitHub Haojae/scipilot-figure-skill v2.1(SKILL.md + README,仅吸收方法论,不下载执行其代码)。
采纳(已折入上文对应小节)
| scipilot 内容 | 进入本 skill | 采纳理由 |
|---|---|---|
| 第 0 步"这张图要论证什么"+ 不默认用户知道自己要什么 | §0 | 通用且成本为零;本论文改稿常见"为画而画",此问能拦住 |
| 顾问式主动拦截(双Y轴/饼图/Y轴截断/rainbow/分类连折线/一图多论点,先劝阻留记录再执行) | §2.3 | 与盲审专家视角一致,全部适用中文学位论文 |
| 视觉自检闭环:渲 PNG→程序/AI 读图→回改→重渲直到通过 | §5.6 | 本地"必目视 PNG"铁律的系统化版本;其 8 项清单(图例压数据/子图对齐/灰度可分)比本地散条更全,合并采纳。程序自检脚本(visual_qa.audit_layout)不下载,用"Read 读 PNG"人工/多模态核对达到同效 |
| 灰度预览(grayscale_preview) | §5.2 | 与"黑白打印友好"铁律天然契合;本地用 ImageMagick 实现思路,不引其脚本 |
| 按最终尺寸出图不二次缩放(figsize 定死、字号绝对单位) | §5.7 | Word/LaTeX 缩放后字号糊是本论文 DOCX 交付的真实风险 |
| 矢量优先、绝不 JPEG | §5.3 | 与本地双格式实践一致,补充"禁 JPEG"底线 |
| 误差必有交代(区间类型+N+来源) | §2.4 | fig_regression 类图直接适用;并叠加本论文"统计量必须脚本派生"铁律 |
| 选图速查表 + 一图一论点 | §0、§2.2 | 裁剪为本论文实际图型子集 |
不采纳(及原因)
| scipilot 内容 | 不采原因 |
|---|---|
| matplotlib + seaborn + SciencePlots + plotly 技术栈 | 本论文既有 12 图全部为 R/ggplot2 + TikZ,FIGURES.md/rebuild_all.sh 可复现体系已建成;换栈=全部重画+图间风格断裂。plotly 交互图对打印论文无意义 |
profile_data.py EDA 数据剖析步 |
本论文无原始 CSV 探索场景——数据全部来自正文已定稿表格,"剖析"退化为§0 的对表核对;且任务约束不执行外部代码 |
| 期刊规范查询(Nature/IEEE 栏宽、投稿 DPI 矩阵) | 目标载体固定为浙大 zjuthesis 模板(正文满栏)+ DOCX,不存在"选期刊"分支;仅保留其"按最终尺寸出图"的底层原则 |
| Okabe-Ito 色盲安全彩板为默认配色 | 与"黑白灰度优先"硬约束冲突——学位论文默认根本不上彩;灰度可分已覆盖色盲可分。彩色被确认允许时可参考,但不是默认 |
| CJK 字体优先级链(Noto Sans CJK > Source Han > SimHei) | 本论文字体已锁定 STHeiti(R/showtext)与 ctex 默认(TikZ),换链会造成新旧图字体不一致 |
| n<10 均值柱→箱线+stripplot 强制拦截 | 本论文图的输入是汇总表值/全量埋点指标,非原始样本点,无点可叠;降级为备用规则(§2.3 末注) |
| 显著性标注桥(statannotations) | 本论文统计规范:埋点全量指标只做描述性统计不做检验;t 检验结果以表呈现,无组间显著性桥需求 |
| 中文期刊"宋体+Times New Roman 数字"混排(serif_for_zh) | 本论文既有图统一 STHeiti 黑体系,中途换衬线混排破坏一致性;zjuthesis 对图内字体无宋体强制 |
7. 标准作业流(SOP 摘要)
- 明确论点 + 定位正文数据表(§0)→ 2. 判断路线①②③(§1)→ 3. 按路线画:R(§2,nature-figure backend=r + 本地环境§2.1)或 TikZ(§3,standalone + crop.py)或转 mac-editable-figure(§4)→ 4. 双格式导出到
figures/(§5.3)→ 5. FIGURES.md 增行 + 接入 rebuild_all.sh(§5.5)→ 6. Read 读 PNG 过验收清单,含灰度检查(§5.6)→ 7. 正文\includegraphics挂接 + 编译grep undefined清零 → 8. 若改的是既有数字:先查 FIGURES.md 反查受影响图,重渲后grep 旧值清零。