FigMirror
Turn your data into an editable matplotlib figure and PDF styled after a reference paper.
- Source repo
- VILA-Lab/FigMirror
- Stars
- ★ 518
- Last updated
- 24d ago
- Primary language
- Python
- FA score
- 50/100 · Major gaps
At a glance
- How it runs
- Works with
- Portable with changesCodex · Claude Code
- Cost
- Free software; you pay for model usage
- Setup effort
- Medium · a few setup steps
- You'll need
- Typical use
- A research author has a figure from a paper and wants to plot new experimental data with a closely related layout and visual style while retaining editable matplotlib code.
- Not a fit if
- Teams standardized on other OpenAI-compatible or local agent backends; only Codex and Claude Code are supported
- Researchers needing reproducible benchmark artifacts; PlotTwin-Bench outputs are unreleased
- Security-controlled environments that cannot review a piped remote install script
- Source review
- 50/100 · Major gaps 2 safety controls not found
What does this agent do, and when should you use it?
FigMirror reproduces the visual style of a reference paper figure using a user's data, producing an editable matplotlib script and a camera-ready PDF. It is delivered as skills for Codex and Claude Code, alongside a local browser interface for uploads, previews, iteration history, and refinement. A top-level Orchestrator runs a bounded loop between the `figmirror-drawer` and `figmirror-reviewer` agents; both harnesses share the same decision state machine and differ only in subagent transport. The Reviewer examines a far-view composite and full-resolution source and candidate images, then returns structured feedback, bounding boxes, a revision checklist, and a preserve list for the next Drawer pass. The workflow covers 2D and 3D figures and stores its artifacts in a local workspace. Its paper reports leading combined scores of 72.7 and 76.4 on a 150-instance PlotTwin-Bench evaluation subset, although the complete reproducibility artifacts remain unreleased.
The user supplies a screenshot of a paper figure and the data to plot. The Orchestrator delegates candidate generation to figmirror-drawer, which uses Grounded Measurement to identify visual coordinates and turn them into executable checks such as cropping a segment and reading pixel colors before producing and running matplotlib code. The figmirror-reviewer compares the reference and candidate at far and full-resolution views, returning a structured audit with bounding boxes, requested revisions, and elements that should be preserved. The Orchestrator converts that feedback into an annotated image and notes for the next Drawer pass, while the preserve list accumulates across iterations to resist style drift. The loop follows a shared decision state machine with a hard iteration cap and ultimately emits an editable matplotlib script and PDF. For 3D figures, the prompting and repair checks additionally address camera position, scale, surfaces, lighting, and geometry.
- A research author has a figure from a paper and wants to plot new experimental data with a closely related layout and visual style while retaining editable matplotlib code.
- A lab needs consistent typography, colors, composition, and visual hierarchy across result figures, with scripts that can remain part of a reproducible workflow.
- A user without a suitable reference can begin with the linked gallery of 139 paper figures spanning 25 chart families.
- A researcher recreating dense multi-panel layouts or joint hexbin plots with marginal histograms can use the Drawer–Reviewer loop to generate and audit successive candidates.
- An author preparing a 3D waterfall or similar scientific plot can use the geometry-aware checks for camera, scale, surfaces, and lighting.
- A Codex or Claude Code user who prefers a browser workflow can run the local Web UI to upload inputs, compare iterations, and request refinements.
How do you install or deploy this agent?
For the complete local Web UI:
git clone https://github.com/VILA-Lab/FigMirror.git && cd FigMirror
bash scripts/install.sh
uv run python scripts/figcopy_serve.py --workspace .artifacts/figmirror-workspace --backend codexThen open http://127.0.0.1:8765/. Replace the final option with --backend claude to use Claude Code. If uv is unavailable, first run python3 -m pip install uv.
For a skill-only installation:
curl -fsSL https://raw.githubusercontent.com/VILA-Lab/FigMirror/main/scripts/install.sh | bashTo select a runtime explicitly, pipe the same URL to bash -s -- --codex, bash -s -- --claude, or bash -s -- --all. The installer detects Codex and Claude Code and installs the figmirror skill plus the figmirror-drawer and figmirror-reviewer custom agents. On shared machines or systems with a small root filesystem, run df -h and point UV_CACHE_DIR to a large user-writable filesystem before the first invocation. No standalone API credential setup is documented; an operational Codex or Claude Code environment is required.
How do you use this agent?
In skill mode, attach a screenshot of the reference paper figure, paste the data, and ask Codex or Claude Code: Use FigMirror to mirror this figure's style with my data. FigMirror then runs the Drawer–Reviewer loop and produces editable matplotlib code and a PDF. For the Web UI, start scripts/figcopy_serve.py, visit http://127.0.0.1:8765/, and use the browser to upload inputs, preview candidates, inspect iteration history, and refine the result. The documented workspace example is .artifacts/figmirror-workspace.
What are this agent's strengths and limitations?
- It delivers both editable matplotlib source and a PDF, rather than limiting the output to a flattened image.
- The role-separated Drawer and Reviewer exchange bounding boxes, revision tasks, and a persistent preserve list, giving each iteration explicit visual feedback.
- Codex and Claude Code share one bounded decision process and can be selected as backends for the same local Web UI.
- Grounded Measurement converts visual coordinate estimates into executable operations such as crops and pixel-color checks instead of relying only on prose judgments.
- The documented scope includes complex 2D compositions and 3D figures, with dedicated checks for camera, scale, surfaces, and lighting.
- A gallery of 139 figures across 25 chart families provides starting references for users who do not already have one.
- The only documented production harnesses are Codex and Claude Code; support for additional OpenAI-compatible or local-agent backends remains a roadmap item and would require adaptation.
- Deployment requires Python,
uv, shell access, filesystem access, and a working Codex or Claude Code installation; small-root or shared machines may need custom cache placement. - The paper reports PlotTwin-Bench results, but the complete references, target data, generated outputs, and evaluation metadata needed for reproduction have not yet been released.
- The repository license is unknown, so organizations must resolve usage, modification, and redistribution rights before adoption.
- The multi-pass generation and review process has a hard cap, but the supplied material does not quantify its runtime cost, latency, or failure rate.
- The quick installer either downloads the repository or pipes a remote script into a shell, which may require prior review in security-controlled environments.
How does this agent compare with similar options?
The paper compares FigMirror with Plot2Code, METAL, ChartGalaxy, and ChartIR in quantitative and qualitative evaluations. All methods in the reported comparison use GPT-5.5; FigMirror records the highest combined score on both splits, scoring 72.7 on 50 hand-curated references and 76.4 on 100 randomly sampled augmented references. The supplied material does not describe the alternatives' deployment models or feature sets, so it does not support a broader comparison of adoption cost or compatibility.
Key facts side by side with the most closely related agents.
| Agent | Source review | Form / cost | Stars | Updated | Language | Full support on |
|---|---|---|---|---|---|---|
| FigMirror This agent | 50 · Major gaps | Agent plugin / skillFree + model costs | ★ 518 | 24d ago | Python | Codex · Claude Code |
| Hiring Agent Resume Scorer | 62 · Some gaps | CLIFree + model costs | ★ 7.2k | 2mo ago | Python | — |
| AutoResearchClaw | 52 · Major gaps | CLIFree + model costs | ★ 15k | 1mo ago | Python | Codex · Claude Code · OpenAI API |
| Qinyan Academic Skills | 48 · Major gaps | CLIFree + model costs | ★ 925 | 2mo ago | Python | Codex · Claude Code |
How does FollowAgents rate this agent?
Why each dimension lost points
Least privilege is only indirectly suggested by the local Web UI, user-owned workspace, and explicit invocation; no permission manifest or sandbox constraints are shown, so support is thin. The normal flow requires the user to attach a figure, provide data, and issue a request, giving reasonably clear initial consent, but no per-iteration or file-write confirmation is documented. The README outlines the Orchestrator/Drawer/Reviewer path and local workspace, yet does not disclose model-provider transfers, network calls, telemetry, retention, or deletion. Sensitive-data, credential, and privacy handling are absent. Dependencies have minimum versions but no lockfile, hashes, audit evidence, or vulnerability-response policy. Installation, skill deployment, generated scripts/PDFs, and workspace writes are external effects, but their exact scope and side effects are not fully documented; rollback and uninstall instructions are absent. Paper authors and citation metadata are supplied, while rights and item-level provenance for reference figures, gallery content, and generated assets remain unclear. No red-line behavior is evidenced.
The README presents a consistent role-separated loop, shared state machine, and bounded iterations, but the supplied test configuration says the project ships with “dependencies=[],” directly conflicting with the three runtime dependencies in pyproject.toml; self-consistency is therefore only partial. Python requirements and minimum versions for Pillow, matplotlib, NumPy, and pytest are explicit, with a uv setup path adequate for ordinary dependency preparation, although versions are not locked and Claude/Codex, system-tool, and backend availability requirements are incomplete. The README merely points to separate troubleshooting material; the supplied evidence contains no concrete failure messages, diagnostic codes, or recovery procedures.
The material clearly distinguishes browser UI, skill-only use, Codex and Claude backends, and scenarios with or without a ready reference, including 2D and 3D scientific figures; audience and scenario coverage is thorough. Boundaries include editable matplotlib output, PDF export, visual iteration, and a hard iteration cap, while the roadmap identifies unreleased evaluation artifacts and incomplete backend hardening; unsupported plot types, data sizes, input formats, and quality limits are not systematically stated. Triggering has concrete prompt examples and explicit image/data prerequisites, but no ambiguity handling, false-trigger controls, or refusal conditions. Environment guidance covers Python 3.10+, uv, disk-cache placement, two backends, and a local port, but lacks an OS matrix, hardware requirements, offline behavior, and compatible backend-version ranges.
The README has clear navigation and well-separated quick start, method, results, roadmap, contribution, and citation sections, earning strong information-architecture credit. Installation covers the Web UI, skill-only setup, backend selection, port, and low-disk guidance, but uses an unpinned curl-to-shell command and the supplied material lacks uninstall steps, complete prerequisites, and installation verification. The FigMirror brand is mostly stable, while figcopy_serve, figcopy_runner, and FigCopy gallery terminology introduce legacy naming inconsistency. Commands, prompt examples, and visual cases are useful, though there is no full FAQ and linked detailed documents were not supplied. Limitations appear mainly as roadmap gaps rather than a systematic limitations section. No license is provided or identified. Dated milestones, version 0.1.0, and a roadmap offer some release history, but there is no formal changelog, tag policy, or compatibility commitment. Contribution paths and cited authors are visible; however, publisher identity is unverified and no named maintainer, support period, security contact, or update responsibility is established.
The intended deliverables—an editable matplotlib script, camera-ready PDF, previews, and iteration history—are concrete and directly usable, so output usability is strongly supported. Reference-conditioned Drawer/Reviewer iteration offers clear marginal value over repeated manual plotting edits and examples span several chart families, although effectiveness evidence is predominantly self-published. Cost-benefit support is thin: a hard iteration cap and local workflow are mentioned, but token usage, latency, compute needs, model fees, and human-review effort are not quantified.
Performance figures are tied to a cited paper and displayed result table, but reproducible PlotTwin-Bench artifacts are explicitly unreleased and the supplied source is insufficient to trace the algorithm and numerical results through implementation, so claim traceability remains weak. README, pyproject, and test configuration provide limited corroboration for naming, Python dependencies, and runtime layout, while also containing a dependency-comment contradiction; no independent source or substantive test evidence is supplied. The text generally distinguishes paper-reported results, product descriptions, completed milestones, and future roadmap items, supporting fact/inference separation, but promotional effectiveness statements are not consistently marked as unverified or self-evaluated.
- Not found in source: sensitive-data handlingUse dedicated, low-privilege, revocable API keys — never production credentials — and keep secrets out of logs.
- Not found in source: rollback or recovery pathBack up first, or work on a git branch or snapshot, so its changes can be undone.
- No license is supplied; confirm authorization terms before copying, modifying, deploying, or distributing the code or generated assets.
- Do not run the unpinned curl-to-shell installer in a sensitive environment without first reviewing and pinning the script and dependency revisions.
- Data, reference-image, model-backend transfer, logging, retention, and deletion behavior are undisclosed; do not submit confidential, personal, or restricted data.
- The reported paper results lack the promised published reproducibility artifacts and should be treated as project-reported rather than independently verified.
- The “dependencies=[]” comment in tests/conftest.py conflicts with pyproject.toml; verify actual runtime dependencies and compatible versions before deployment.
- Rollback, uninstall, resource-cost, and detailed failure-recovery evidence is absent; evaluate in an isolated workspace and retain backups of inputs and generated files.
FAQ
Do I have to use Codex or Claude Code?
--backend codex or --backend claude; broader OpenAI-compatible and local-agent backend support is still on the roadmap.