# 中文流程图/图表渲染:matplotlib 坑 + HTML 首选方案
> 2026-06-16 实战教训:给 Maggie 画流程图,matplotlib 反复把中文渲染成"豆腐块"(空心方块 tofu),折腾数轮。根因与可靠方案如下。
## matplotlib 中文豆腐块根因
- 系统装了文泉驿 `wqy-zenhei.ttc`,但 **matplotlib 默认不把 `.ttc` 注册进字体缓存**——`rcParams['font.sans-serif']=['WenQuanYi Zen Hei']` 按"字体名"查找会**静默失败、回退成豆腐块**,不报错。
- `fc-list :lang=zh` 能看到字体 ≠ matplotlib 能按名字用它。
## 可靠修复(若必须用 matplotlib)
**给每个 text 显式传 `fontproperties` 指向字体文件**,不靠字体名查找:
```python
import matplotlib.font_manager as fm
FP = fm.FontProperties(fname="/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf")
# Droid Sans Fallback 是 .ttf、已在缓存、支持全中文,比 .ttc 可靠
ax.text(x, y, "租赁合同", fontproperties=FP) # 每处都带 fontproperties
```
验证某字体文件能否渲染中文:渲染单字 '租',统计中心 1/3 区域笔画占比,>0.08 是真字、<0.05 是空心豆腐块。
## ★ 首选方案:用 HTML 而非 matplotlib PNG
**给非技术用户(Maggie,经企微/OnlyOffice 看)的中文图表/流程图,优先做成自包含 HTML**:
1. **中文渲染零风险**——浏览器直接调系统字体,`font-family:"Microsoft YaHei","PingFang SC","WenQuanYi Zen Hei",sans-serif`,绝不豆腐块。
2. **企微能直接打开**,可缩放。
3. **可自检**——`browser_navigate` 到 `file://` 后看快照里的文字是否正确,比赌 PNG 字体渲染可靠得多。
4. 用 div + border + 颜色块画节点、`↓`/`→` 字符画箭头,配色用语义色(蓝=主审、绿=subagent、金=交付)。
可复制的起始模板:`templates/lease-review-flowchart.html`。
## ⚠️ 语义色点用纯 CSS 圆点,不要用 emoji(🔵🟢🔴)(2026-06-22 workflow流程图实证)
图例/节点里标语义色,**别用 emoji 彩色圆点**——无头浏览器截图环境(Browserbase 等)常缺 emoji 字体,截图里 emoji 渲染成空心方框 `▢`(文本层 emoji 字符其实完好、`browser_console` 测 `looksLikeBox:false`,只是那个截图环境字体缺失)。但你**无法保证 Maggie 的企微/设备一定有 emoji 字体**,交付物要万无一失。
- 正解:用**纯 CSS 圆点** ``:`.dot{display:inline-block;width:11px;height:11px;border-radius:50%;border:1.5px solid;}`,各色 `.dot.b{background:#BBD9F0;border-color:#2E6DA4;}`…。任何设备、任何环境稳定显示,不依赖 emoji 字体。
- 节点本身已有语义底色时,标题里的 emoji 色点是冗余,直接删(靠底色表达语义即可)。
- 表意标记 emoji(⚠️📌✅)可保留——渲染更稳,且是真正的语义标记,不是纯装饰色点。
- 自检:`browser_navigate` 到 `file://` 后用 `browser_console` 读 `.lg` 的 textContent 确认文本层完整;再 `vision_analyze`/`browser_vision` 看截图确认色点真渲染成彩色圆点(不是方框)。
## 图像自检:vision 已配好,是主路径(2026-06-22)
vision_analyze/browser_vision 已由技术支持配好可用——交付 PNG/HTML 截图前**先自己 vision 看一遍**验证版面/配色/截断/乱码,这是主路径(实测能准确读出渲染图的配色、文字截断、版面错位、色点是否方框)。
- **HTML 双层自检**:`browser_navigate` 到 `file://` 看快照验证中文/结构(文本层)+ `browser_vision` 看视觉层(配色/排版/emoji 方框)——两层都过才发。
- **兜底(vision 万一又报 "No LLM provider configured for task=vision" 或连不上)**:不把"看不见的 PNG"直接甩用户,改用能推理正确性的格式——HTML(看 `browser_navigate` 快照验证文本层)或纯文字版流程图(方框+箭头字符,零字体依赖),HTML+纯文字兜底一起发。