| name | haipipe-paper-display-figure |
| description | Generate publication-quality data plots from experiment results (line/bar/scatter/heatmap/box). Use when user says "画图", "作图", "generate figures", "paper plots", or needs data-driven plots for a paper. The plot renderer of the display family; tables are rendered by haipipe-paper-display-table. |
| argument-hint | [figure-plan-or-data-path] |
| allowed-tools | Bash(*), Read, Write, Edit, Grep, Glob, Agent, mcp__codex__codex, mcp__codex__codex-reply |
| metadata | {"version":"1.2.0","last_updated":"2026-06-22","summary":"Generate publication-quality data plots from experiment results (the plot renderer of the display family).","changelog":["1.2.0 (2026-06-22): joined the display family as haipipe-paper-display-figure; shed table rendering to haipipe-paper-display-table (now plots-only); bumped reviewer model to gpt-5.5.","1.1.0 (2026-06-05): renamed from paper-figure to haipipe-paper-figure (haipipe-paper-* name unification).","1.0.0 (2026-05-31): baseline metadata added."]} |
Paper Display Figure: Publication-Quality Plots from Experiment Data
Generate the data plots for a paper based on: $ARGUMENTS
Boundary: this skill renders plots only. For typeset LaTeX tables
(coefficient/descriptive/comparison/ablation), use
haipipe-paper-display-table. For architecture/pipeline diagrams use
haipipe-paper-display-diagram; for AI concept art use
haipipe-paper-display-illustration.
Output: write into a display unit (not flat figures/)
When the target is a paper (a folder with 0-displays/), the plot goes into a
0-displays/displayNN-<slug>/ unit, NOT a flat figures/ directory. Follow the
shared contract: ../haipipe-paper-display/ref/display-unit-output-contract.md.
For THIS renderer: asset -> assets/figure.pdf; rebuild spec -> source/gen_*.py
(+ source/paper_plot_style.py). Wire float.tex, compile preview.pdf, set
README status. Flat figures/ is a fallback only when there is no paper.
Scope: What This Skill Can and Cannot Do
| Category | Can auto-generate? | Examples |
|---|
| Data-driven plots | ✅ Yes | Line plots (training curves), bar charts (method comparison), scatter plots, heatmaps, box/violin plots |
| Comparison tables | ➡️ Use haipipe-paper-display-table | LaTeX tables (prior bounds, method features, ablation) now live in the dedicated table renderer |
| Multi-panel figures | ✅ Yes | Subfigure grids combining multiple plots (e.g., 3×3 dataset × method) |
| Architecture/pipeline diagrams | ❌ No — manual | Model architecture, data flow diagrams, system overviews. At best can generate a rough TikZ skeleton, but expect to draw these yourself using tools like draw.io, Figma, or TikZ |
| Generated image grids | ❌ No — manual | Grids of generated samples (e.g., GAN/diffusion outputs). These come from running your model, not from this skill |
| Photographs / screenshots | ❌ No — manual | Real-world images, UI screenshots, qualitative examples |
In practice: For a typical ML paper, this skill handles the data plots (a large share of the figure set). Tables go to haipipe-paper-display-table; the hero figure / architecture diagram / qualitative results are created via the diagram/illustration skills or manually and placed in figures/ before running /haipipe-paper-edit-write. The skill will detect manually-made figures as "existing figures" and preserve them.
Constants
- STYLE =
publication — Visual style preset. Options: publication (default, clean for print), poster (larger fonts), slide (bold colors)
- DPI = 300 — Output resolution
- FORMAT =
pdf — Output format. Options: pdf (vector, best for LaTeX), png (raster fallback)
- COLOR_PALETTE =
tab10 — Default matplotlib color cycle. Options: tab10, Set2, colorblind (deuteranopia-safe)
- FONT_SIZE = 10 — Base font size (matches typical conference body text)
- FIG_DIR — for a paper, the display unit
0-displays/displayNN-slug/ (plot -> assets/figure.pdf, scripts -> source/). Flat figures/ only with no paper.
- REVIEWER_MODEL =
gpt-5.5 — Model used via Codex MCP for figure quality review.
Inputs
- PAPER_PLAN.md — figure plan table (from
/haipipe-paper-minimap; plan outline folded in, see its ref/plan-outline.md)
- Experiment data — JSON files, CSV files, or screen logs in
figures/ or project root
- Existing figures — any manually created figures to preserve
If no PAPER_PLAN.md exists, scan for data files and ask the user which figures to generate.
Workflow
Step 1: Read Figure Plan
Parse the Figure Plan table from PAPER_PLAN.md:
| ID | Type | Description | Data Source | Priority |
|----|------|-------------|-------------|----------|
| Fig 1 | Architecture | ... | manual | HIGH |
| Fig 2 | Line plot | ... | figures/exp.json | HIGH |
Identify:
- Which figures can be auto-generated from data (this skill)
- Which need manual creation (architecture diagrams, etc.)
- Which rows are tables -> route those to
haipipe-paper-display-table, not here
Step 2: Set Up Plotting Environment
Create a shared style configuration script:
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams.update({
'font.size': FONT_SIZE,
'font.family': 'serif',
'font.serif': ['Times New Roman', 'Times', 'DejaVu Serif'],
'axes.labelsize': FONT_SIZE,
'axes.titlesize': FONT_SIZE + 1,
'xtick.labelsize': FONT_SIZE - 1,
'ytick.labelsize': FONT_SIZE - 1,
'legend.fontsize': FONT_SIZE - 1,
'figure.dpi': DPI,
'savefig.dpi': DPI,
'savefig.bbox': 'tight',
'savefig.pad_inches': 0.05,
'axes.grid': False,
'axes.spines.top': False,
'axes.spines.right': False,
'text.usetex': False,
'mathtext.fontset': 'stix',
})
COLORS = plt.cm.tab10.colors
def save_fig(fig, name, fmt=FORMAT):
"""Save figure to FIG_DIR with consistent naming."""
fig.savefig(f'{FIG_DIR}/{name}.{fmt}')
print(f'Saved: {FIG_DIR}/{name}.{fmt}')
Step 3: Auto-Select Figure Type
Use this decision tree for data-driven figures (inspired by Imbad0202/academic-research-skills):
| Data Pattern | Recommended Type | Size |
|---|
| X=time/steps, Y=metric | Line plot | 0.48\textwidth |
| Methods × 1 metric | Bar chart | 0.48\textwidth |
| Methods × multiple metrics | Grouped bar / radar | 0.95\textwidth |
| Two continuous variables | Scatter plot | 0.48\textwidth |
| Matrix / grid values | Heatmap | 0.48\textwidth |
| Distribution comparison | Box/violin plot | 0.48\textwidth |
| Multi-dataset results | Multi-panel (subfigure) | 0.95\textwidth |
| Prior work comparison / coefficients | (table) → use haipipe-paper-display-table | — |
Step 4: Generate Each Figure
For each figure in the plan, create a standalone Python script:
Line plots (training curves, scaling):
from paper_plot_style import *
import json
with open('figures/exp_results.json') as f:
data = json.load(f)
fig, ax = plt.subplots(1, 1, figsize=(5, 3.5))
ax.plot(data['steps'], data['fac_loss'], label='Factorized', color=COLORS[0])
ax.plot(data['steps'], data['crf_loss'], label='CRF-LR', color=COLORS[1])
ax.set_xlabel('Training Steps')
ax.set_ylabel('Cross-Entropy Loss')
ax.legend(frameon=False)
save_fig(fig, 'fig2_training_curves')
Bar charts (comparison, ablation):
fig, ax = plt.subplots(1, 1, figsize=(5, 3))
methods = ['Baseline', 'Method A', 'Method B', 'Ours']
values = [82.3, 85.1, 86.7, 89.2]
bars = ax.bar(methods, values, color=[COLORS[i] for i in range(len(methods))])
ax.set_ylabel('Accuracy (%)')
for bar, val in zip(bars, values):
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.3,
f'{val:.1f}', ha='center', va='bottom', fontsize=FONT_SIZE-1)
save_fig(fig, 'fig3_comparison')
Comparison / coefficient tables (LaTeX): out of scope — use
haipipe-paper-display-table, which owns booktabs rules, significance stars, SE
rows, panels, and table notes. Do not emit .tex tables from this skill.
Architecture/pipeline diagrams (MANUAL — outside this skill's scope):
- These require manual creation using draw.io, Figma, Keynote, or TikZ
- This skill can generate a rough TikZ skeleton as a starting point, but do not expect publication-quality results
- If the figure already exists in
figures/, preserve it and generate only the LaTeX \includegraphics snippet
- Flag as
[MANUAL] in the figure plan and latex_includes.tex
Step 5: Run All Scripts
for script in gen_fig*.py; do
python "$script"
done
Verify all output files exist and are non-empty.
Step 6: Generate LaTeX Include Snippets
For each figure, output the LaTeX code to include it:
% === Fig 2: Training Curves ===
\begin{figure}[t]
\centering
\includegraphics[width=0.48\textwidth]{figures/fig2_training_curves.pdf}
\caption{Training curves comparing factorized and CRF-LR denoising.}
\label{fig:training_curves}
\end{figure}
Save all snippets to figures/latex_includes.tex for easy copy-paste into the paper.
Step 7: Figure Quality Review with REVIEWER_MODEL
Send figure descriptions and captions to GPT-5.5 for review:
mcp__codex__codex:
model: gpt-5.5
config: {"model_reasoning_effort": "xhigh"}
prompt: |
Review these figure/table plans for a [VENUE] submission.
For each figure:
1. Is the caption informative and self-contained?
2. Does the figure type match the data being shown?
3. Is the comparison fair and clear?
4. Any missing baselines or ablations?
5. Would a different visualization be more effective?
[list all figures with captions and descriptions]
Step 8: Quality Checklist
Before finishing, verify each figure (from pedrohcgs/claude-code-my-workflow):
Output
Paper target (DEFAULT) — into the display unit (see the contract):
0-displays/displayNN-slug/
├── float.tex # caption + \label + \includegraphics{assets/figure.pdf}
├── preview.tex / preview.pdf
├── assets/figure.pdf # the rendered plot
└── source/
├── gen_figNN_*.py # per-figure script (reproducible)
└── paper_plot_style.py # shared style config
Fallback (no paper / scratch) — flat:
figures/
├── paper_plot_style.py
├── gen_figNN_*.py
├── figNN_*.pdf
└── latex_includes.tex
(Tables are produced by haipipe-paper-display-table, not here.)
Key Rules
- Every figure must be reproducible — save the generation script alongside the output
- Do NOT hardcode data — always read from JSON/CSV files
- Use vector format (PDF) for all plots — PNG only as fallback
- No decorative elements — no background colors, no 3D effects, no chart junk
- Consistent style across all figures — same fonts, colors, line widths
- Colorblind-safe — verify with https://davidmathlogic.com/colorblind/ if needed
- One script per figure — easy to re-run individual figures when data changes
- No titles inside figures — captions are in LaTeX only
- Tables are not figures — route any LaTeX table to
haipipe-paper-display-table
Figure Type Reference
| Type | When to Use | Typical Size |
|---|
| Line plot | Training curves, scaling trends | 0.48\textwidth |
| Bar chart | Method comparison, ablation | 0.48\textwidth |
| Grouped bar | Multi-metric comparison | 0.95\textwidth |
| Scatter plot | Correlation analysis | 0.48\textwidth |
| Heatmap | Attention, confusion matrix | 0.48\textwidth |
| Box/violin | Distribution comparison | 0.48\textwidth |
| Architecture | System overview | 0.95\textwidth |
| Multi-panel | Combined results (subfigures) | 0.95\textwidth |
Acknowledgements
Design pattern (type × style matrix) inspired by baoyu-skills. Publication style defaults and figure rules from pedrohcgs/claude-code-my-workflow. Visualization decision tree from Imbad0202/academic-research-skills.