2026/10/2 22:05:37

代码实现原理:scipilot-figure-skill 的 visual_qa 如何拦截缺字与乱码

代码实现原理:scipilot-figure-skill 的 visual_qa 如何拦截缺字与乱码 代码实现原理scipilot-figure-skill 的 visual_qa 如何拦截缺字与乱码【免费下载链接】scipilot-figure-skillSciPilot Skills family - Publication-grade scientific figure copilot for Claude Code项目地址: https://gitcode.com/gh_mirrors/sc/scipilot-figure-skillscipilot-figure-skill 是 SciPilot Skills 家族的科研数据可视化顾问技能而它的 scripts/visual_qa.py 正是出图后「程序自检」的机器层——专治 matplotlib 成图中最常见的缺字与乱码中文变□□□豆腐块、负号变方框、±、μ、希腊字母缺字并顺带检查文字越界裁切和刻度标签重叠把排版问题挡在投稿之前。为什么缺字乱码会藏到投稿才暴露matplotlib 处理缺字的方式非常温柔遇到缺失字符只发一条 warning图照样画出来不报错根因分析见 references/viz_pitfalls.md 的 P16 条目。而它的默认字体DejaVu Sans 等根本不含中文字符表axes.unicode_minusTrue时负号也可能渲染成方框。于是常见事故就是画的时候没注意终端里那行小字投稿时审稿人看到的却是一张满是方框的图。visual_qa要解决的就是把这两条告警通道变成必须过审的质检关卡。设计定位自检闭环里的机器那一层v2.1 版本的视觉自检闭环分为两层分工详见 references/visual_review.md层负责抓程序自检本文主角 visual_qa确定性问题缺字乱码、文字越界裁切、刻度标签重叠AI 读图感知性问题图例压数据、子图标签对齐、配色灰度可分缺字乱码属于确定性问题——字体表里有没有这个字符答案唯一所以交给程序判断又快又不会漏。核心实现①双通道拦截缺字告警缺字检测的入口是_draw_and_collect_glyph_warnings。它的关键设计是同时挂住两条告警通道warnings 通道用warnings.catch_warnings(recordTrue)记录渲染期间所有 warning老版本 matplotlib 走这条logging 通道自定义_GlyphLogHandler挂到matplotliblogger 上新版本走这条。两边都用一组关键词过滤_GLYPH_MARKERSmissing from、Glyph、findfont命中即收集最后去重并保持顺序。渲染这一步很讲究fig.savefig直接写进内存BytesIO不落盘——目的不是存图而是让 renderer 真正执行一次绘制缺字告警只在真正绘制时触发顺便让 renderer 就绪供后续的文字越界测量复用。核心实现②缺字即 FAIL并附上修复建议audit_layout汇总所有检测结果返回[(severity, msg), ...]列表严重级别约定与 scripts/check_figure.py 保持一致INFO WARN FAIL。缺字被直接判定为FAILaudit_layoutL148-L157且告警信息不是冷冰冰的一句出错而是带着处方检测到缺字成图会出现方框/乱码……中文图请先setup_style(langzh)配置 CJK 字体若是负号方框确认axes.unicode_minusFalse。这样 AI 或开发者拿到报告就能直接定位到 scripts/setup_style.py 的字体配置环节去修而不是反复猜。核心实现③顺手把裁切和刻度重叠也查了renderer 就绪之后audit_layout还做两项 WARN 级检查文字越界裁切遍历图中所有可见Text对象用get_window_extent(renderer)量出包围盒超出画布边界留 2px 容差就告警。注意它刻意跳过刻度标签——刻度贴边属于constrained_layout的自动处理范围查它们只会误报L168-L198刻度标签重叠对相邻 tick label 的包围盒做水平/垂直相交判断x 轴看水平、y 轴看垂直容差 1px相交即提示旋转刻度或减少刻度_ticklabels_overlap。整个过程非破坏性只渲染测量不修改 fig 内容。配套能力render_preview 渲出可被 AI 看见的预览程序查完确定性问题感知性问题还得靠 AI 读图。render_preview负责把图栅格化成中分辨率 PNG默认 150 dpibbox_inchestight——矢量 PDF/SVG 没法直接看像素重叠必须先转位图。它接受三种输入matplotlib Figure 对象主路径、已落盘的位图路径、PDF需可选依赖 PyMuPDF。典型的自检闭环用法只有三行from visual_qa import render_preview, audit_layout, print_report render_preview(fig, figs/_preview.png, dpi150) # 给 AI 读图 print_report(audit_layout(fig)) # 缺字/裁切/重叠随后用 Read 工具读这张 PNG对照 references/visual_review.md 的 8 项读图清单逐条核对发现问题回改、重渲、再读直到通过SKILL.md 第 6 步 有完整流程。相关文件导航文件角色scripts/visual_qa.py本文主角双通道缺字拦截 裁切/重叠检查 PNG 预览references/visual_review.md视觉自检闭环协议AI 读图 8 项清单 回改对应表references/viz_pitfalls.mdP16 缺字乱码条目根因分析与正确做法scripts/setup_style.pyCJK 字体自动配置从源头减少乱码SKILL.md8 步核心工作流与自检闭环定义一句话总结visual_qa的精髓不在于检测本身而在于它把 matplotlib 那条容易被忽略的缺字 warning升级成了一条必须处理才能过检的 FAIL 关卡——再配合 AI 读图复核感知性问题中文方框和乱码在导出之前就被拦下了。【免费下载链接】scipilot-figure-skillSciPilot Skills family - Publication-grade scientific figure copilot for Claude Code项目地址: https://gitcode.com/gh_mirrors/sc/scipilot-figure-skill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考