跳到正文

直接改图, 代码还在。

面向 matplotlib 与 AI 生成科研图的可视化编辑器。点中要改的东西、以毫米排出版面、按出版规范预检、导出——画出这张图的代码一直都在。

或者在任何平台上从 PyPI 安装: pipx install "tavotto[worker]"

Tavotto 工作台:左栏是这张图里所有元素的树,中间是 150 × 112.5 mm 版面上排好的 (a)(b)(c) 三张面板,右栏是选中标题的属性——字体、9 pt、文字内容,以及源文件 fig1_kinetics.py。

150 × 112.5 mm

图早就画完了。 Figure 1 还没有。

投稿前的最后一段路通常是:改一行、重跑、看一眼、再改。来回二十遍,而要改的都是些看得见却不好用语言描述的东西——图例往左三毫米、刻度标签小一号、面板 (b) 和面板 (a) 对齐。

另一条路是把 PDF 拖进矢量编辑器手工收尾,然后接受一件事:从此这张图和画出它的代码再无关系。

Tavotto 是第三条路。打开图、改你看得见的东西、导出。脚本原地不动,每一步都可撤销。

  1. 1 改代码
  2. 2 跑脚本
  3. 3 看一眼
  4. 4 再改代码
  5. 5 再跑一遍
  6. 6 循环往复
  1. 1 点中标题
  2. 2 拖动图例
  3. 3 对齐面板
  4. 4 导出

画图的是 matplotlib。Tavotto 负责的是视觉上的最后一公里——它不替代你的绘图代码。

从一张 plot 到 Figure 1

Tavotto 图内编辑特写:画布上标题 “Reaction kinetics” 处于选中状态,属性面板显示它的字体、9 pt 字号与源脚本 fig1_kinetics.py。

改 matplotlib 已经画出来的东西。

双击一张面板,Tavotto 把你的脚本跑一遍,并把那个 matplotlib Figure 留在内存里。从这一刻起你改的就是这张图本身:标题、坐标轴标签、某条刻度、某条曲线、图例、脚本画的箭头——从元素树里选,或者直接在画布上点——改字号、颜色、字重、线型,或者干脆拖到别处去。图跟着光标一帧一帧地动,matplotlib 只在你松手时跑一次定稿。

  • 标题 · 图例 · 曲线
  • 坐标轴、刻度与刻度格式
  • 字体、颜色、位置
  • 箭头与标注

Serif · 9 pt · fig1_kinetics.py

以毫米排出 Figure 1。

面板落在以毫米计的版面上,尺寸就是脚本画出来的尺寸。拖动、互相吸附、多选对齐与分布,或者把几张面板绑成行 / 列 / 网格——尺寸一变自动重排。(a)(b)(c) 面板标签一条命令生成,文字、箭头、形状标注叠在上层。

  • 物理版面、物理尺寸
  • 吸附、对齐、分布、成组
  • 行 / 列 / 网格自动重排
  • (a)(b)(c) 标签一条命令
Tavotto 排版态:左栏素材库列出三个源 PDF 与它们的物理尺寸,中间是排好的版面、其中一张面板处于选中状态,右栏是它的位置、毫米尺寸与缩放比例。
导出对话框里的预检清单:阻断项指出文字的最终有效字号低于规范的 8.5 pt 与 8 pt 下限,警告关于边框线宽与图例字号,另有建议与一条标为无法核验的条目。

在审稿人之前发现问题。

写出任何文件之前,Tavotto 先按出版规范 profile 把图检查一遍。字号一律按最终物理尺寸判——面板摆成 60% 时比的是 fontsize × 0.6,不是脚本里写的那个数。

阻断
在你书面确认之前不让导出。
警告
一定展示,绝不静默略过。
无法核验
真的查不了的那些——比如外部位图内部的文字——需要人来看。
建议
绝不替你做决定。

检查依据的是可按期刊覆盖的出版规范 profile。Tavotto 指出查得出来的问题——不承诺期刊一定收。

导出的是图,不是图的截屏。

导出 PDF 时,每张原始矢量面板按原样整块嵌入,文字仍然是可选中、可搜索的真文字;PNG 由同一份 PDF 栅格化,两者绝不会不一致。预检结论——连同你明确确认过的那些——可以写进随成图产出的 proof report。

  • 矢量 PDF,文字还是文字
  • PNG 与 PDF 同源
  • 可选的 proof report

tavottofile/export/

  • Fig1.pdf 矢量 · 真文字
  • Fig1.png 300 dpi · 同一份 PDF
  • Fig1_proof.json 预检结论 + 你的确认

VECTOR PDF · 300 DPI PNG

第一稿交给 AI, 收尾在图上完成。

编程助手写的第一版 matplotlib 已经相当好,剩下的都是视觉活儿——图例高了两行、这张面板想再小一点、标签压住了一个数据点。把这些用提示词描述一遍,比自己动手还慢。

工作流:你、Claude 或 Codex 写的 Python 脚本跑 matplotlib 产出矢量 PDF;Tavotto 负责图内编辑、排版与投稿前检查;结果是 PDF 或 PNG。脚本全程是源头。

一条命令交接一张图

tavotto open figures/Fig1_kinetics.pdf

终端里或 agent 里都行。它会把这张图所在的图库当项目打开,把图送进已经开着的那个窗口——不会另起一套。

Codex 插件

一个 skill、一个本地 MCP server,以及一块与桌面应用同一份前端代码构建的内嵌画布。Codex Desktop 内的部分集成尚未在真实 Codex Desktop 里验证过——插件 README 里写明了是哪些。

脚本全程是源头。

为投稿前的最后 5% 而造。

出版要求都是物理量:栏宽以毫米计、字号下限以 pt 计、位图下限以 dpi 计。Tavotto 拿排好的版面逐项去量。

80 / 150 mm
默认 profile 的单栏与双栏宽度
8.5 pt
严格字号下限——按最终物理尺寸判,8 pt 是绝对底线
300 dpi
栅格化输出的最低要求
0.5–1.5 pt
边框与曲线比对的线宽档位

规则收在一份带版本的 profile 里,引擎与界面读的是同一份。期刊栏宽不同时,一行覆盖即可,不用另起一套——而这条覆盖会记进 proof report。

你的图,不出你的电脑。

渲染、排版、导出都是本地进程。Tavotto 不会把你的图、脚本、项目文件或数据上传到任何地方——没发表的结果不出这栋楼。

  • 本地渲染
  • 本地排版
  • 本地导出
  • 不上传图
  • 不上传代码

它自己只发两种请求

每天最多一次向 GitHub Releases 查新版本;以及——只在你明确同意之后——匿名用量统计,其事件结构在设计上就装不下文件名、路径、图内文字或提示词。两个开关彼此独立,谁也不代管对方。

可选的改图助手调用的是你机器上的 Codex 或 Claude 命令行,而且必须由你点名。

阅读隐私政策

把图改完,而不是重写一遍。

macOS(Apple Silicon)· Windows · 其余平台走 PyPI

开源,AGPL-3.0 许可。你用它做出的图与 PDF 完全属于你。