現(xiàn)原理:scipilot-figure-skill 的 visual_qa 如何攔截缺字與亂碼)
代碼實(shí)現(xiàn)原理scipilot-figure-skill 的 visual_qa 如何攔截缺字與亂碼【免費(fèi)下載鏈接】scipilot-figure-skillSciPilot Skills family - Publication-grade scientific figure copilot for Claude Code項(xiàng)目地址: https://gitcode.com/gh_mirrors/sc/scipilot-figure-skillscipilot-figure-skill 是 SciPilot Skills 家族的科研數(shù)據(jù)可視化顧問(wèn)技能而它的 scripts/visual_qa.py 正是出圖后「程序自檢」的機(jī)器層——專治 matplotlib 成圖中最常見的缺字與亂碼中文變□□□豆腐塊、負(fù)號(hào)變方框、±、μ、希臘字母缺字并順帶檢查文字越界裁切和刻度標(biāo)簽重疊把排版問(wèn)題擋在投稿之前。為什么缺字亂碼會(huì)藏到投稿才暴露matplotlib 處理缺字的方式非常溫柔遇到缺失字符只發(fā)一條 warning圖照樣畫出來(lái)不報(bào)錯(cuò)根因分析見 references/viz_pitfalls.md 的 P16 條目。而它的默認(rèn)字體DejaVu Sans 等根本不含中文字符表axes.unicode_minusTrue時(shí)負(fù)號(hào)也可能渲染成方框。于是常見事故就是畫的時(shí)候沒(méi)注意終端里那行小字投稿時(shí)審稿人看到的卻是一張滿是方框的圖。visual_qa要解決的就是把這兩條告警通道變成必須過(guò)審的質(zhì)檢關(guān)卡。設(shè)計(jì)定位自檢閉環(huán)里的機(jī)器那一層v2.1 版本的視覺自檢閉環(huán)分為兩層分工詳見 references/visual_review.md層負(fù)責(zé)抓程序自檢本文主角 visual_qa確定性問(wèn)題缺字亂碼、文字越界裁切、刻度標(biāo)簽重疊AI 讀圖感知性問(wèn)題圖例壓數(shù)據(jù)、子圖標(biāo)簽對(duì)齊、配色灰度可分缺字亂碼屬于確定性問(wèn)題——字體表里有沒(méi)有這個(gè)字符答案唯一所以交給程序判斷又快又不會(huì)漏。核心實(shí)現(xiàn)①雙通道攔截缺字告警缺字檢測(cè)的入口是_draw_and_collect_glyph_warnings。它的關(guān)鍵設(shè)計(jì)是同時(shí)掛住兩條告警通道warnings 通道用warnings.catch_warnings(recordTrue)記錄渲染期間所有 warning老版本 matplotlib 走這條logging 通道自定義_GlyphLogHandler掛到matplotliblogger 上新版本走這條。兩邊都用一組關(guān)鍵詞過(guò)濾_GLYPH_MARKERSmissing from、Glyph、findfont命中即收集最后去重并保持順序。渲染這一步很講究fig.savefig直接寫進(jìn)內(nèi)存BytesIO不落盤——目的不是存圖而是讓 renderer 真正執(zhí)行一次繪制缺字告警只在真正繪制時(shí)觸發(fā)順便讓 renderer 就緒供后續(xù)的文字越界測(cè)量復(fù)用。核心實(shí)現(xiàn)②缺字即 FAIL并附上修復(fù)建議audit_layout匯總所有檢測(cè)結(jié)果返回[(severity, msg), ...]列表嚴(yán)重級(jí)別約定與 scripts/check_figure.py 保持一致INFO WARN FAIL。缺字被直接判定為FAILaudit_layoutL148-L157且告警信息不是冷冰冰的一句出錯(cuò)而是帶著處方檢測(cè)到缺字成圖會(huì)出現(xiàn)方框/亂碼……中文圖請(qǐng)先setup_style(langzh)配置 CJK 字體若是負(fù)號(hào)方框確認(rèn)axes.unicode_minusFalse。這樣 AI 或開發(fā)者拿到報(bào)告就能直接定位到 scripts/setup_style.py 的字體配置環(huán)節(jié)去修而不是反復(fù)猜。核心實(shí)現(xiàn)③順手把裁切和刻度重疊也查了renderer 就緒之后audit_layout還做兩項(xiàng) WARN 級(jí)檢查文字越界裁切遍歷圖中所有可見Text對(duì)象用get_window_extent(renderer)量出包圍盒超出畫布邊界留 2px 容差就告警。注意它刻意跳過(guò)刻度標(biāo)簽——刻度貼邊屬于constrained_layout的自動(dòng)處理范圍查它們只會(huì)誤報(bào)L168-L198刻度標(biāo)簽重疊對(duì)相鄰 tick label 的包圍盒做水平/垂直相交判斷x 軸看水平、y 軸看垂直容差 1px相交即提示旋轉(zhuǎn)刻度或減少刻度_ticklabels_overlap。整個(gè)過(guò)程非破壞性只渲染測(cè)量不修改 fig 內(nèi)容。配套能力render_preview 渲出可被 AI 看見的預(yù)覽程序查完確定性問(wèn)題感知性問(wèn)題還得靠 AI 讀圖。render_preview負(fù)責(zé)把圖柵格化成中分辨率 PNG默認(rèn) 150 dpibbox_inchestight——矢量 PDF/SVG 沒(méi)法直接看像素重疊必須先轉(zhuǎn)位圖。它接受三種輸入matplotlib Figure 對(duì)象主路徑、已落盤的位圖路徑、PDF需可選依賴 PyMuPDF。典型的自檢閉環(huán)用法只有三行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對(duì)照 references/visual_review.md 的 8 項(xiàng)讀圖清單逐條核對(duì)發(fā)現(xiàn)問(wèn)題回改、重渲、再讀直到通過(guò)SKILL.md 第 6 步 有完整流程。相關(guān)文件導(dǎo)航文件角色scripts/visual_qa.py本文主角雙通道缺字?jǐn)r截 裁切/重疊檢查 PNG 預(yù)覽references/visual_review.md視覺自檢閉環(huán)協(xié)議AI 讀圖 8 項(xiàng)清單 回改對(duì)應(yīng)表references/viz_pitfalls.mdP16 缺字亂碼條目根因分析與正確做法scripts/setup_style.pyCJK 字體自動(dòng)配置從源頭減少亂碼SKILL.md8 步核心工作流與自檢閉環(huán)定義一句話總結(jié)visual_qa的精髓不在于檢測(cè)本身而在于它把 matplotlib 那條容易被忽略的缺字 warning升級(jí)成了一條必須處理才能過(guò)檢的 FAIL 關(guān)卡——再配合 AI 讀圖復(fù)核感知性問(wèn)題中文方框和亂碼在導(dǎo)出之前就被攔下了。【免費(fèi)下載鏈接】scipilot-figure-skillSciPilot Skills family - Publication-grade scientific figure copilot for Claude Code項(xiàng)目地址: https://gitcode.com/gh_mirrors/sc/scipilot-figure-skill創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考