Skip to content
Back to skills

Figure Engine

ASecurity

Activate when the user needs to generate, refine, or evaluate academic figures, diagrams, or statistical plots. Uses PaperBanana to transform text descriptions or data files into publication-quality illustrations via direct Python API call. Fallback: matplotlib/seaborn.

  • 18 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added May 27, 2026
data-aipythongoshellbashgitapi

Works with

  • api
  • mcp

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned May 27, 2026

npx -y skills add TobiasBlask/open-paper-machine --skill figure-engine --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Figure Engine?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Figure Engine
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tobiasblask-figure-engine/badge)](https://www.skillsdirectory.com/skills/tobiasblask-figure-engine)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: figure-engine
description: >
  Activate when the user needs to generate, refine, or evaluate academic figures,
  diagrams, or statistical plots. Uses PaperBanana to transform text descriptions
  or data files into publication-quality illustrations via direct Python API call.
  Fallback: matplotlib/seaborn.
---

> **Orchestration Log**: When this skill is activated, append a log entry to `outputs/orchestration_log.md`:
> ```
> ### Skill Activation: Figure Engine
> **Timestamp:** [current date/time]
> **Actor:** AI Agent (figure-engine)
> **Input:** [brief description of the figure request]
> **Output:** [brief description of what was produced — e.g., "Generated methodology diagram (fig03_methodology.png), 3 iterations"]
> ```

# Figure Engine

## Core Principle
Academic papers need professional figures. This skill eliminates manual design work
by using PaperBanana to generate publication-quality diagrams and plots from text
descriptions or data files. Claude should produce ACTUAL FIGURES, not describe what
to draw.

> **Based on:** Zhu, D., Meng, R., Song, Y., Wei, X., Li, S., Pfister, T., & Yoon, J. (2026).
> *PaperBanana: Automating Academic Illustration for AI Scientists.* [arXiv:2601.23265](https://arxiv.org/abs/2601.23265).
> The pipeline uses a 5-agent, 2-phase architecture: Retriever → Planner → Stylist (Phase 1: planning),
> then Visualizer ↔ Critic iterative refinement (Phase 2: generation) with VLM-as-Judge evaluation.
> Official research repo: [`dwzhu-pku/PaperBanana`](https://github.com/dwzhu-pku/PaperBanana).

## Prerequisites

PaperBanana must be installed: `pip install paperbanana[mcp,google]`

A `GOOGLE_API_KEY` must be available via one of:
- Environment variable `GOOGLE_API_KEY`
- `.env` file in project root
- `~/.paperbanana.env`

Get a free key at https://aistudio.google.com/apikey

---

## Method Priority

### Priority Order:
1. **PRIMARY — Direct Python API** (via Bash → python3) — ALWAYS use this
2. **FALLBACK — matplotlib/seaborn** — If PaperBanana is not installed at all

> **Note:** The PaperBanana MCP server is NOT used. The MCP stdio transport is
> unreliable (timeouts, hangs, silent failures). Always use the direct Python API.

---

## Method 1: Direct Python API (PRIMARY — Always Use This)

The plugin ships a helper script `scripts/paperbanana_direct.py` that calls the
PaperBanana Python API directly via `asyncio.run()`, completely bypassing the
MCP stdio transport. It outputs JSON to stdout.

### Locating the Script

The script is at `scripts/paperbanana_direct.py` inside the plugin directory.
To find it reliably across any installation:

```bash
PB_SCRIPT="$(find ~/.claude/plugins -name paperbanana_direct.py -path '*/open-academic-paper-machine/*' 2>/dev/null | head -1)"
```

### Generate Diagram

For **short** source contexts (< 1000 chars), pass inline:

```bash
PB_SCRIPT="$(find ~/.claude/plugins -name paperbanana_direct.py -path '*/open-academic-paper-machine/*' 2>/dev/null | head -1)" && \
python3 "$PB_SCRIPT" diagram \
  --source-context "The research follows a three-stage SLR methodology..." \
  --caption "Figure 1: Systematic Literature Review Process" \
  --output-dir figures/ \
  --filename "fig_method_slr_process.png" \
  --iterations 3
```

For **long** source contexts, write to a temp file first to avoid shell escaping issues:

```bash
# Step 1: Write source context to temp file
cat > /tmp/pb_source_context.txt <<'CTXEOF'
[FULL METHODOLOGY TEXT / FRAMEWORK DESCRIPTION HERE — can be multiple paragraphs,
include all relevant details about components, relationships, and visual structure]
CTXEOF

# Step 2: Generate the figure
PB_SCRIPT="$(find ~/.claude/plugins -name paperbanana_direct.py -path '*/open-academic-paper-machine/*' 2>/dev/null | head -1)" && \
python3 "$PB_SCRIPT" diagram \
  --source-context "$(cat /tmp/pb_source_context.txt)" \
  --caption "Figure N: Descriptive Caption" \
  --output-dir figures/ \
  --filename "fig_section_description.png" \
  --iterations 3
```

### Generate Plot

```bash
PB_SCRIPT="$(find ~/.claude/plugins -name paperbanana_direct.py -path '*/open-academic-paper-machine/*' 2>/dev/null | head -1)" && \
python3 "$PB_SCRIPT" plot \
  --data '{"categories": ["2020","2021","2022","2023","2024"], "values": [12,25,48,89,156]}' \
  --caption "Bar chart showing exponential growth in AI adoption across financial services" \
  --output-dir figures/ \
  --filename "fig_results_adoption_growth.png" \
  --iterations 3
```

### Evaluate Diagram

```bash
PB_SCRIPT="$(find ~/.claude/plugins -name paperbanana_direct.py -path '*/open-academic-paper-machine/*' 2>/dev/null | head -1)" && \
python3 "$PB_SCRIPT" evaluate \
  --generated figures/fig_generated.png \
  --reference figures/fig_reference.png \
  --context "Original methodology text" \
  --caption "Figure caption"
```

### Reading the Output

The script prints JSON to stdout:
- Success: `{"status":"ok","image_path":"figures/fig_name.png","iterations":3,"metadata":{...}}`
- Error: `{"status":"error","message":"..."}`

On success, show the figure to the user using the Read tool on the PNG path.

### Timeout

PaperBanana generation takes 30-180 seconds (3 refinement iterations). Set a
generous Bash timeout of **300 seconds** (5 minutes) when calling the script.

---

## Method 2: Python matplotlib/seaborn (FALLBACK)

If PaperBanana is not installed at all, generate figures with Python directly:

```python
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Agg')
import seaborn as sns

plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams.update({
    'font.family': 'serif',
    'font.size': 11,
    'axes.titlesize': 13,
    'axes.labelsize': 12,
    'figure.figsize': (10, 6),
    'figure.dpi': 300,
    'savefig.dpi': 300,
    'savefig.bbox_inches': 'tight',
})
```

For methodology diagrams without PaperBanana, use networkx or graphviz:
```python
import networkx as nx
# Build a directed graph and render with matplotlib
```

---

## When the User Says "Make Me a Figure" — What to Do

1. **Determine figure type**: diagram (methodology, framework, process) or plot (bar, line, scatter, etc.)
2. **Gather input**: text description for diagrams, data file for plots
3. **Generate using Direct Python API** (Method 1) — ALWAYS use this
4. **If Method 1 fails**: fall back to matplotlib/seaborn (Method 2)
5. **Save to figures/ directory** in the working folder
6. **Provide LaTeX include snippet** ready for copy-paste
7. **Show the generated figure** to the user using Read tool on the PNG

---

## Diagram Prompting Guide

Good source context for PaperBanana includes:
- **What the diagram shows**: "This figure illustrates the three-phase research design"
- **Key components**: "Phase 1: Literature Search, Phase 2: Screening, Phase 3: Analysis"
- **Relationships**: "Phase 1 feeds into Phase 2, which filters down to Phase 3"
- **Style hints**: "PRISMA-style flow diagram" or "layered architecture diagram"
- **Layout direction**: "left-to-right flow" or "top-to-bottom hierarchy"

The **communicative_intent** (caption) should describe WHAT the figure communicates,
not just what it contains. Good: "Three-pillar model showing how education, process
redesign, and encoded judgment sequentially build sovereign AI mastery." Bad: "Figure 1."

---

## Academic Figure Standards

### General Rules
- **Resolution:** Minimum 300 DPI for print
- **Width:** Match journal column width (single column ~8.5cm, double column ~17.5cm)
- **Font:** Serif fonts (Times, Computer Modern) matching paper body
- **Colors:** Use colorblind-friendly palettes (e.g., Okabe-Ito, viridis)
- **Labels:** All axes labeled with units, legend if multiple series
- **Caption:** Descriptive, can stand alone without reading the text

### LaTeX Integration
Always provide the complete figure environment:
```latex
\begin{figure}[htbp]
\centering
\includegraphics[width=\linewidth]{figures/FILENAME.png}
\caption{DESCRIPTIVE CAPTION}
\label{fig:SHORT_LABEL}
\end{figure}
```

For side-by-side figures:
```latex
\begin{figure}[htbp]
\centering
\begin{minipage}{0.48\textwidth}
  \centering
  \includegraphics[width=\linewidth]{figures/LEFT.png}
  \caption{Left caption}
  \label{fig:left}
\end{minipage}
\hfill
\begin{minipage}{0.48\textwidth}
  \centering
  \includegraphics[width=\linewidth]{figures/RIGHT.png}
  \caption{Right caption}
  \label{fig:right}
\end{minipage}
\end{figure}
```

### File Naming Convention
`fig_SECTION_DESCRIPTION.png`
- `fig_method_prisma_flow.png`
- `fig_results_adoption_by_year.png`
- `fig_framework_sociotechnical.png`

---

## Integration with Paper Machine

When used inside the `/write-paper` pipeline (Phase 4: Production), the figure-engine
should be called automatically for sections that need visual support:

| Section | Typical Figures |
|---------|----------------|
| Methodology | Research design overview, PRISMA flow, sampling diagram |
| Results | Distribution plots, frequency charts, concept maps |
| Discussion | Framework diagram, comparison matrix, implications model |

The writing-engine should reference generated figures with `\ref{fig:label}` in the text.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.