Five-Step Figure Generation Pipeline
SkillAI & modelsFive-step figure generation pipeline inspired by PaperVizAgent (Google Research, 2026). Orchestrates Retriever → Planner → Stylist → Visualizer → Critic stages for publication-quality scientific figures. Retrieves reference figures from literature, plans layout and composition, applies journal-specific styling, generates the figure, then critiques and refines. Use when the user needs high-quality figures for papers/presentations and wants a more deliberate, reference-driven approach than direct code generation. Especially useful for multi-panel figures and complex data visualizations.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Five-Step Figure Generation Pipeline skill
What this skill tells your AI
The instructions your AI receives, as published by zaoqu-liu/scienceclaw in skills/figure-pipeline/SKILL.md and read by ahel’s review.
Generate publication-quality scientific figures through a structured pipeline with reference retrieval, planning, styling, generation, and self-critique. Inspired by PaperVizAgent's five-agent architecture.
When to Use
- Multi-panel composite figures (e.g., "Figure 1: A) boxplot, B) KM curve, C) heatmap, D) network")
- Figures that need to match a specific journal's style
- Complex visualizations where direct code generation often produces suboptimal layouts
- User explicitly asks for "publication-quality" or "journal-ready" figures
- Graphical abstracts
When NOT to use (overkill):
- Single simple plot → just write matplotlib/ggplot2 code directly
- Mechanism diagrams → use
svg-scientific-figuresskill - Quick exploratory plots → direct code
Pipeline Steps
Step 1: RETRIEVE — Find Reference Figures
Search for published figures on the same topic to establish visual expectations:
bash: echo "=== PubMed figure captions ===" && \
curl -s "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmode=json&retmax=10&sort=relevance&term=TOPIC+AND+(figure+OR+visualization)" && \
echo -e "\n=== bioRxiv recent figures ===" && \
curl -s "https://api.biorxiv.org/details/biorxiv/2025-01-01/2026-03-18?jou=biorxiv" 2>/dev/null | head -c 2000
Also search for figure captions in full-text papers via Asta or Europe PMC:
curl -s "https://www.ebi.ac.uk/europepmc/webservices/rest/search?query=TOPIC+AND+FIG_TYPE:figure&format=json&pageSize=5"
From reference figures, extract:
- Figure types used (violin plot vs boxplot, clustered vs simple heatmap)
- Panel arrangement (2x2 grid, horizontal strip, vertical stack)
- Color schemes (which journal palette)
- Annotation patterns (significance brackets, gene labels, axis formatting)
Step 2: PLAN — Design Figure Composition
Create a structured figure plan:
{
"figure_id": "Figure 1",
"title": "THBS2 Expression and Survival Analysis Across Cancer Types",
"layout": {
"type": "grid",
"rows": 2,
"cols": 2,
"width_cm": 17.5,
"height_cm": 15
},
"panels": [
{
"id": "A",
"type": "boxplot",
"data": "TCGA pan-cancer expression",
"x": "cancer_type",
"y": "THBS2_expression_TPM",
"notes": "Sort by median expression, highlight significant (red asterisks)"
},
{
"id": "B",
"type": "kaplan_meier",
"data": "PAAD survival",
"groups": "THBS2_high vs THBS2_low",
"notes": "Include risk table, log-rank p, HR with 95%CI"
},
{
"id": "C",
"type": "heatmap",
"data": "Immune cell correlation matrix",
"notes": "Cluster by correlation, annotate r values for significant pairs"
},
{
"id": "D",
"type": "dot_plot",
"data": "GO enrichment top 15 terms",
"notes": "Color by p-value, size by gene count, order by enrichment score"
}
],
"shared_style": {
"palette": "NPG",
"font": "Arial",
"label_size": 8,
"title_size": 10
}
}
Step 3: STYLE — Apply Journal-Specific Formatting
Select and apply styling rules based on target journal:
| Journal Category | Width | DPI | Font | Palette | Panel Labels |
|---|---|---|---|---|---|
| Nature/Science/Cell | 8.9cm (single) / 18.3cm (double) | 300 | Arial/Helvetica | NPG | Bold uppercase A, B, C |
| Lancet/NEJM/JAMA | 8.5cm / 17.5cm | 300 | Arial | Lancet/NEJM | Bold a, b, c |
| Cancer Research | 8.5cm / 17.5cm | 300 | Arial | AACR | Bold A, B, C |
| Default (no journal specified) | 17.5cm (double) | 300 | Arial | NPG | Bold A, B, C |
Styling rules:
- Axis labels: 8-9pt, sentence case
- Axis tick labels: 7-8pt
- Panel labels: 10-12pt, bold, top-left corner outside plot area
- Legend: 7-8pt, outside plot or in open space
- Significance annotations:
*p<0.05,**p<0.01,***p<0.001,nsnot significant - Color: use colorblind-friendly palettes; never use red-green only
- Grid lines: minimal or none; let data speak
Step 4: VISUALIZE — Generate the Figure
Write Python or R code implementing the planned figure. Use the styling rules from Step 3.
Python approach (for multi-panel):
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(17.5/2.54, 15/2.54), dpi=300)
gs = gridspec.GridSpec(2, 2, hspace=0.35, wspace=0.35)
ax_a = fig.add_subplot(gs[0, 0])
# Panel A code...
ax_a.text(-0.15, 1.05, 'A', transform=ax_a.transAxes, fontsize=12, fontweight='bold')
ax_b = fig.add_subplot(gs[0, 1])
# Panel B code...
# ... etc
plt.savefig(out_path, dpi=300, bbox_inches='tight', facecolor='white')
R approach (using patchwork):
library(ggplot2); library(patchwork)
p_a <- ggplot(...) + labs(tag = "A")
p_b <- ggplot(...) + labs(tag = "B")
combined <- (p_a | p_b) / (p_c | p_d)
ggsave(out_path, combined, width=17.5, height=15, units="cm", dpi=300)
Step 5: CRITIQUE — Review and Refine
After generating the figure, perform a quality review:
Checklist:
- All panel labels (A, B, C, D) present and correctly positioned?
- All axis labels present, readable, and correctly spelled?
- Legend present where needed? Not obscuring data?
- Font sizes consistent across all panels?
- Color palette consistent across all panels?
- Significance annotations correct and complete?
- White space balanced? No cramped or empty areas?
- Data accurately represented? (spot-check values against source data)
- Figure would be understandable from caption alone?
- Resolution sufficient for print (300 DPI at target size)?
If any check fails, go back to Step 4 and fix. Maximum 2 refinement rounds.
After passing critique:
✅ Figure review passed (10/10 checks)
Saved: figures/figure1_thbs2_landscape.png (17.5 x 15 cm, 300 DPI)
Output
| File | Description |
|---|---|
figures/figure1_DESCRIPTION.png | Final PNG at 300 DPI |
figures/figure1_DESCRIPTION.pdf | Vector PDF (when using R/matplotlib PDF backend) |
figures/figure1_DESCRIPTION.svg | SVG if generated via the SVG skill |
Integration with Research Recipes
When a Recipe generates multiple figure outputs, offer to combine them into a composite figure using this pipeline:
"已生成 4 张独立图表。需要用 Figure Pipeline 组装为一张多面板组合图吗?"
Signals
- GitHub stars
- 60
- Forks
- 14
- Last commit
- Mar 2026
Advanced
- Catalog kind
- skill
- Gateway key
figure-pipeline- Source
- github.com/zaoqu-liu/scienceclaw