FigMirror: reference-conditioned figure styling for matplotlib papers
An Automated AI Agent Tool for Plotting Your Data in Any Paper's Figure Style.
At a glance
- What is it?
- FigMirror is an agent tool that takes a reference figure plus your data and returns an editable matplotlib script and a PDF. Its Drawer/Reviewer loop and PlotTwin-Bench evaluation are the interesting parts; the licence and the maintenance path are the parts to check before you build on it.
- Who is it for?
- Adopt FigMirror if you already work inside Claude Code or Codex and your bottleneck is matching a target venue's figure conventions rather than choosing a chart type. Do not adopt it if you need a permissively licensed dependency you can vendor, or if your figures must be generated in a headless CI pipeline without an agent in the loop.
- Can I use it commercially?
- Not without permission. GitHub finds no licence file in the repository, and without a licence all rights are reserved by default: you may read the code but not reuse it. Check the README, or ask the authors, before using it.
- Is it still maintained?
- Yes. The repository last received commits 14 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The problem FigMirror targets: style matching, not chart selection
Most plotting assistants answer the wrong question. If you already know you want a joint hexbin plot with marginal histograms, a generic chart generator gives you a joint hexbin plot with default matplotlib styling, and you then spend an afternoon moving tick labels, matching font sizes to the rest of your paper, and redoing the panel spacing. FigMirror inverts that. The README describes the workflow as picking a reference figure, pasting your data, and getting an editable matplotlib script plus a camera-ready PDF. The style target is an image you supply, not a chart type you name. That makes it useful to a narrow group: researchers and engineers writing papers or reports where the figures must sit inside an existing visual family, either the conventions of a specific venue or the look of figures already published in the same project. The repository topics include paper-figures, scientific-visualization and research-tools, which matches that audience. It is not a general business-dashboard tool, and the showcase examples (a dense multi-panel composition, a joint hexbin plot, a 3D waterfall plot) are all paper-figure shapes.
The Drawer/Reviewer loop and the bounded iteration contract
The mechanism is an iterative agent loop rather than a single generation pass. The milestones list a June 17, 2026 algorithm update that refined the Codex path with role-separated Drawer and Reviewer agents, far-near visual review views, reviewer bounding boxes, and annotated feedback passed into the next iteration. An August 17, 2026 entry says the same production role-separated loop was ported to Claude Code with the same decision state machine and bounded iteration contract. Read that as the architecture: one agent writes or edits the matplotlib script, a second agent inspects the rendered result against the reference, marks up regions with bounding boxes, and hands that annotation back as input to the next drawing pass. The phrase bounded iteration contract matters more than it looks. Without a bound, a visual-refinement loop has no natural stopping point, because each render can always be nudged closer. The README does not state the actual iteration cap or the stopping rule, so if you need to reason about cost per figure you will have to read docs/method.md or the arXiv preprint (2608.28814) rather than the README. The paper is titled FigMirror: Ground It, Code It, Plot It, which suggests the grounding step (locating the reference's structural elements) precedes code generation.
What PlotTwin-Bench measures, and what the reported scores do not tell you
The August 28, 2026 preprint introduces PlotTwin-Bench for reference-conditioned scientific-figure style transfer. The evaluation subset is 150 instances: all 50 hand-curated references plus 100 randomly sampled augmented references. The README reports that FigMirror achieves the highest combined score on both splits, 72.7 on hand-curated references and 76.4 on augmented references, with all methods in the comparison using GPT-5.5. Two things are worth flagging. First, the splits are reported separately, which is the honest way to do it, and the README explicitly notes this. Second, the comparison is against four baselines named in the qualitative figure caption: Plot2Code, METAL, ChartGalaxy, and ChartIR. The combined score is a composite of code and vision sub-scores, so a high combined number can hide a weak code score compensated by a strong visual score, or the reverse. The README shows the main results table as an image rather than as text, so the sub-score breakdown is not readable from the repository description alone. If code editability is what you care about, check the code column of that table before trusting the headline number.
Getting it running: two install paths and a local Web UI
There are two ways in. The first assumes you are already inside Claude Code or Codex and hands the setup to the agent: the README's quick-start block is the single line 'Install FigMirror for me: https://github.com/VILA-Lab/FigMirror'. That path installs FigMirror as a skill, and the repository carries both a Codex skill badge and a Claude Code skill badge. The second path is the local Web UI, described as the option to use when you want upload, preview, iteration history, and refinement in a browser. The README section is truncated at exactly that point, so the concrete launch command, port, and any config keys are not visible in the supplied material. I cannot tell you what to type to start it. The repository does document a separate method file at docs/method.md and a contributing guide at docs/contributing.md, and the arXiv paper is at arxiv.org/abs/2608.28814, so the Web UI launch instructions are presumably in one of those. If you are evaluating this for a team, the missing piece is the Web UI entry point; the agent-skill path is the one fully specified in the README.
The licence is unstated, and that is a real adoption blocker
The repository metadata gives the licence as unknown, and the README does not name one. That is not a cosmetic gap. If you are deciding whether to depend on FigMirror inside a commercial product, or whether you can vendor the plotting skill into an internal repository, the licence is the first thing you need and it is the one thing the supplied material does not provide. The README does invite contributions via docs/contributing.md, which implies an open development model, but an invitation to contribute is not a licence grant. Note also that FigMirror orchestrates a hosted model; the README states that all methods in the PlotTwin-Bench comparison use GPT-5.5, so whatever you plot passes through that provider's terms as well as FigMirror's. Check the repository root for a LICENSE file before you plan around this. I am not giving legal advice here, only pointing at the gap.
Where the loop breaks: dense panels, small text, and the wrong kind of task
The showcase itself hints at the failure mode. Group A in the qualitative comparison is described as a dense multi-panel composition, and dense multi-panel figures are where a visual-diff loop has the least room to manoeuvre, because a bounding-box annotation on a crowded panel can point at a region whose fix would break three neighbouring panels. Small text is the other soft spot: a Reviewer agent working from a rendered image has to read tick labels and legend entries to judge them, and at typical figure resolutions that is exactly the information that degrades first. The README does not report a resolution floor or a minimum font size the loop can handle, so treat that as unverified. There is also a category error to avoid. FigMirror is reference-conditioned, so if you have no reference figure and no strong opinion about style, you are paying for an iteration loop you do not need. A plain matplotlib script or a seaborn call is faster and cheaper. The 139-figure gallery across 25 chart families exists precisely for people who lack a reference, but borrowing a reference from a gallery means you are now matching someone else's style rather than your own, which may be the opposite of what a venue-specific submission needs.
How it differs from Plot2Code, METAL, ChartGalaxy and ChartIR
The four baselines named in the qualitative comparison are the honest set to measure against, and the README's own framing puts the difference in the conditioning signal. These systems broadly take a chart image and try to reproduce or translate it, which is a chart-to-code or chart-to-chart problem. FigMirror conditions on a reference for style while the data is supplied separately by the user, so the output must be a new figure that carries your numbers in someone else's visual language. That is a harder constraint than straight reproduction, because the model cannot copy coordinates out of the reference; it has to infer which properties are style (fonts, spines, panel proportions, colour ramp) and which are data. The evaluation design reflects this: PlotTwin-Bench scores both code and vision, and the README's qualitative figure shows the reference, FigMirror, and all four baselines side by side on the same target data, in two groups. If your actual need is to digitise an existing chart back into code, one of those baselines is likely the more direct tool, and FigMirror's extra machinery is overhead.
Maintenance cost and what to watch on upgrade
FigMirror is at v0.1.0, released May 23, 2026 and labelled a Public Preview, with the last push to main on September 2, 2026. The milestone list shows a steady cadence through that window: skills shipped June 1, the Codex algorithm update June 17, an internal hybrid style scorer July 1, Claude Code parity August 17, and the preprint August 28. The August 17 entry is the one that matters for maintenance planning: the Claude Code path was ported to reach parity with the Codex path, which means the two agent backends are maintained as parallel implementations of the same state machine. Parallel implementations drift. If you adopt one backend, pin to a release tag rather than tracking main, and re-check the other backend's milestone entries when you upgrade. The internal hybrid style scorer built on July 1 is described as being for repeatable method comparison, which suggests it is an evaluation harness rather than something your plotting run depends on, but the README does not say whether it ships in the package. That is a question for docs/method.md. On a Public Preview version, expect the skill interface and the iteration contract to change between minor releases.
Editorial conclusion
Adopt FigMirror if you already work inside Claude Code or Codex and your bottleneck is matching a target venue's figure conventions rather than choosing a chart type. Do not adopt it if you need a permissively licensed dependency you can vendor, or if your figures must be generated in a headless CI pipeline without an agent in the loop. Verify the repository licence file first, since the README does not state one, and confirm the Web UI's local-only claim before uploading any data you would not paste into a hosted model.
Community notes