# Figure Composer

Compose one publication-grade multi-panel figure.

- Repository: https://github.com/HughYau/AcademicForge (2620 stars)
- Category: Engineering
- License: Apache-2.0
- Last updated: 2026-08-30
- Runs scripts: yes, review before use

## Install

Claude Code: `npx skills add HughYau/AcademicForge --skill figure-composer -g -a claude-code -y`
Codex: `npx skills add HughYau/AcademicForge --skill figure-composer -g -a codex -y`
Cursor: `npx skills add HughYau/AcademicForge --skill figure-composer -g -a cursor -y`
Gemini CLI: `npx skills add HughYau/AcademicForge --skill figure-composer -g -a gemini-cli -y`

## Description

Compose one publication-grade multi-panel figure. Entry from a one-line claim + data files, OR from an existing figure via `derive_outline_prompt` (you read the PNG). Runs a per-figure loop: outline (12-col grid, per-panel ask + label_budget) → render each panel with `panel_task` (loading `figure-style`), one at a time or parallelized → tile + stamp letters with `compose_figure` → adversarial composite self-review with two-tier feedback (Tier-1 outline_revisions / Tier-2 per-panel violations) → regen affected panels, ≤3 rounds. Helpers: panel_task / compose_figure / compose_crops / composite_review_task / derive_outline_prompt. For one standalone plot use `figure-style`; for whole-paper figure ordering use `paper-narrative`.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# Figure Composer, narrative → panels → compose → adversarial loop

Compose ONE publication-grade multi-panel figure: turn a one-sentence claim plus
data files into an outline, render each panel, tile them into a composite, and
harden it through an adversarial self-review loop.

## Setup (any agent, no API key)
This is a **pure skill**, `kernel.py` is deterministic Python (PIL geometry plus
schema/prompt builders) and *you* (the base model) do all the reasoning:
reverse-engineering an outline from a figure, rendering panels, and the
adversarial composite review. There is no `host` runtime and no LLM API. Load
the helpers once per session in a Python cell:
```python
exec(open("figure-composer/kernel.py").read())
```
Nothing auto-loads it outside Claude Science. Then call the helpers
(`panel_task`, `compose_figure`, `compose_crops`, `composite_review_task`,
`derive_outline_prompt`, …) directly; if one raises `NameError`, you have not
exec'd `kernel.py`. Dependencies: `pip install pillow matplotlib`.

**Step 0.** Load `figure-style` alongside this skill, that is the
design rules (and `apply_figure_style()` + helpers). You need it in context to
write the outline, render the panels, and review the composite. Each panel is
rendered against those same rules, whether you draw it yourself or hand it to a
sub-agent (see §2), the maker loads `figure-style` first.

## Inputs

- **claim**, one sentence the figure makes true to a reader who reads nothing else.
- **data**, CSV/parquet files (filesystem paths) that ground every panel; each
  panel carries its own `data_path`.
- **width_mm**, target venue's column width (common: 85, 89mm single, 174, 183mm double; check the venue guide).

## 0. Where this sits

The rest: https://github.com/HughYau/AcademicForge/blob/HEAD/skills/claude-science/figure-composer/SKILL.md
