Generates publication-quality figures for ML papers from research context. Given a paper section or description, extracts system components and relationships to generate architecture diagrams via Gemini. Given experiment results or data, auto-selects chart type and generates data-driven figures via matplotlib/seaborn. Use when creating any figure for a conference paper.
SKILL.md
Academic Plotting for ML Papers
Generate publication-quality figures for ML/AI conference papers. Two distinct workflows:
Diagram figures (architecture, system design, workflows, pipelines) — AI image generation via Gemini
Data figures (line charts, bar charts, scatter plots, heatmaps, ablations) — matplotlib/seaborn
When to Use Which Workflow
Figure Type
Tool
Why
Architecture / system diagram
Gemini (Workflow 1)
Complex spatial layouts with boxes, arrows, labels
Workflow / pipeline / lifecycle
Gemini (Workflow 1)
Multi-step processes with connections
Bar chart, line plot, scatter
matplotlib (Workflow 2)
Precise numerical data, reproducible
Heatmap, confusion matrix
matplotlib/seaborn (Workflow 2)
Structured grid data
Ablation table as chart
matplotlib (Workflow 2)
Grouped bars or line comparisons
Pie / donut chart
matplotlib (Workflow 2)
Proportional data (use sparingly in ML papers)
Training curves
matplotlib (Workflow 2)
Loss/accuracy over steps/epochs
Rule of thumb: If the figure has numerical axes, use matplotlib. If the figure has boxes and arrows, use Gemini.
Step 0: Context Analysis & Extraction
The user will typically provide one of these inputs — not a ready-made specification:
Installs
0
Input Type
Example
What to Extract
Full paper / section draft
"Here's our method section..."
System components, their relationships, data flow
Description paragraph
"Our system has three layers that..."
Key entities, hierarchy, connections
Raw results / data table
"MMLU: 85.2, HumanEval: 72.1..."
Metrics, methods, comparison structure
CSV / JSON data
Experiment log files
Variables, trends, grouping dimensions
Vague request
"Make a figure for the overview"
Read surrounding paper context to infer content
Extraction Workflow
For diagrams (research context → architecture figure):
Read the provided context — paper section, abstract, or description paragraph
Identify visual entities — What are the main components/modules/stages?
Look for: nouns that represent system parts, named modules, layers, stages
Count them: if >8 top-level entities, consider grouping into sections
Identify relationships — How do components connect?
Hub-and-spoke → central node with radiating connections
Hierarchical → top-down tree
Assign colors — One accent color per logical group/layer
Write every label exactly — Extract exact terminology from the paper text
For data charts (results → figure):
Read the provided data — table, paragraph with numbers, CSV, or JSON
Identify dimensions:
What is being compared? (methods, models, configurations) → categorical axis
What is the metric? (accuracy, loss, latency, F1) → value axis
Is there a time/step dimension? → line plot
Are there multiple metrics? → multi-panel or grouped bars
Choose chart type automatically using this priority:
Has a step/time axis → line plot
Comparing N methods on M benchmarks → grouped bar chart
Single ranking → horizontal bar (leaderboard)
Correlation between two continuous variables → scatter plot
Square matrix of values → heatmap
Proportional breakdown → stacked bar (avoid pie charts)
Determine figure sizing — Single column vs full width based on data density
Highlight "our method" — Identify which entry is the paper's contribution and give it a distinct color
Auto-Detection Examples
Context → Diagram: "Our system has a Planner, Executor, and Verifier. Planner sends plans to Executor, Executor returns results to Verifier, Verifier feeds back to Planner on failure."
→ 3 entities, cycle layout, dashed feedback arrow → Workflow 1 (Gemini)
Workflow 1: Architecture & System Diagrams (AI Image Generation)
Use Gemini 3 Pro Image Preview to generate diagrams. Choose a visual style first — this is the single biggest factor in whether the figure looks professional or generic.
Visual Styles
Pick one style per paper (all figures should be consistent):
Style A: "Sketch / 简笔画" (Hand-Drawn)
Warm, approachable, memorable. Ideal for overview figures and system introductions. Looks like a whiteboard sketch refined by a designer.
VISUAL STYLE — HAND-DRAWN SKETCH:
- Slightly irregular, hand-drawn line quality — lines wobble gently, not perfectly straight
- Rounded, soft shapes with visible pen strokes (like drawn with a thick felt-tip marker)
- Warm off-white background (#FAFAF7), NOT pure white
- Fill colors are soft watercolor-like washes: muted blue (#D6E4F0), soft peach (#F5DEB3),
light sage (#D4E6D4), pale lavender (#E6DFF0)
- Borders are dark charcoal (#2C2C2C) with 2-3px line weight, slightly uneven
- Arrows are hand-drawn with slight curves, ending in simple open arrowheads (not filled triangles)
- Text uses a rounded sans-serif font (like Comic Neue or Architects Daughter feel)
- Small doodle-style icons inside boxes: a tiny gear ⚙ for processing, a lightbulb 💡 for ideas,
a magnifying glass 🔍 for search — rendered as simple line drawings, NOT emoji
- Overall feel: a carefully drawn whiteboard diagram, clean but with personality
- NO clip art, NO stock icons, NO photorealistic elements
Style B: "Modern Minimal" (Clean & Bold)
Confident, authoritative. Best for method figures where precision matters.
VISUAL STYLE — MODERN MINIMAL:
- Ultra-clean geometric shapes with crisp edges
- Bold color blocks as backgrounds for sections — NOT just accent bars, but full section fills
using desaturated tones: slate blue (#E8EDF2), warm sand (#F5F0E8), cool mint (#E8F2EE)
- Component boxes have ROUNDED CORNERS (12px radius), NO visible border — they float on
the section background using subtle shadow (1px, 4px blur, rgba(0,0,0,0.06))
- ONE accent color per section used sparingly on key elements: Deep blue (#2563EB),
Emerald (#059669), Amber (#D97706), Rose (#E11D48)
- Arrows are thin (1.5px), dark gray (#6B7280), with small filled circle at source
and clean arrowhead at target — NOT thick colored arrows
- Typography: Inter or system sans-serif, title 600 weight, body 400 weight
- Labels INSIDE boxes, not beside them
- Generous whitespace — at least 24px between elements
- NO decorative elements, NO icons — let the structure speak
Style C: "Illustrated Technical" (Icon-Rich)
Engaging, explanatory. Good for tutorial-style papers and figures that need to be self-explanatory.
VISUAL STYLE — ILLUSTRATED TECHNICAL:
- Each major component has a small MEANINGFUL ICON drawn in a consistent line-art style
(single color, 2px stroke, ~24x24px): brain icon for reasoning, database cylinder for storage,
arrow-loop for iteration, network nodes for communication
- Components sit inside soft rounded rectangles with a LEFT COLOR STRIP (4px wide)
- Background is pure white, but each logical group has a very faint colored region behind it
(#F8FAFC for blue group, #FFF8F0 for orange group)
- Connections use CURVED bezier paths (not straight lines), colored by SOURCE component
- Key data flows are THICKER (3px) than secondary flows (1px, dashed)
- Small annotation badges on arrows: "×N" for repeated operations, "optional" in italics
- Title labels are ABOVE each section in small caps, letter-spaced
- Overall: like a well-designed API documentation diagram
Style D: "Accent Bar" (Classic Academic)
The default academic style. Safe for any venue, works well in grayscale.
VISUAL STYLE — CLASSIC ACCENT BAR:
- Horizontal section bands stacked vertically, pale gray (#F7F7F5) fill
- Thick colored LEFT ACCENT BAR (8px) distinguishes each section
- Content boxes: white fill, thin #DDD border, 4px rounded corners
- Section palette: Blue #4A90D9, Teal #5BA58B, Amber #D4A252, Slate #7B8794
- Sans-serif typography (Helvetica/Arial), bold titles, regular body
- Colored arrows match their SOURCE section
- Clean, flat, zero decoration
Generate script at figures/gen_fig_<name>.py, run for 3 attempts
Review, select best, save as figures/fig_<name>.png
Prompt Structure (6 Sections)
Every Gemini prompt must include these sections in order:
1. FRAMING (5 lines): "Create a [STYLE_NAME]-style technical diagram for a
[VENUE] paper. The diagram should feel [ADJECTIVES]..."
2. VISUAL STYLE (20-30 lines): Copy the full style block from above (A/B/C/D).
This is the most important section — it determines the entire visual character.
3. COLOR PALETTE (10 lines): Exact hex codes for every color used.
4. LAYOUT (50-150 lines): Every component, box, section — exact text, spatial
arrangement, and grouping. Be exhaustively specific.
5. CONNECTIONS (30-80 lines): Every arrow individually — source, target, style,
label, routing direction.
6. CONSTRAINTS (10 lines): What NOT to include. Adapt per style — e.g., sketch
style allows slight irregularity but still no clip art.
Generation Script Template
#!/usr/bin/env python3
"""Generate [FIGURE_NAME] diagram using Gemini image generation."""
import os, sys, time
from google import genai
API_KEY = os.environ.get("GEMINI_API_KEY")
if not API_KEY:
print("ERROR: Set GEMINI_API_KEY environment variable.")
print(" Get a key at: https://aistudio.google.com/apikey")
sys.exit(1)
MODEL = "gemini-3-pro-image-preview"
OUTPUT_DIR = os.path.dirname(os.path.abspath(__file__))
client = genai.Client(api_key=API_KEY)
PROMPT = """
[PASTE YOUR 6-SECTION PROMPT HERE]
"""
def generate_image(prompt_text, attempt_num):
print(f"
{'='*60}
Attempt {attempt_num}
{'='*60}")
try:
response = client.models.generate_content(
model=MODEL,
contents=prompt_text,
config=genai.types.GenerateContentConfig(
response_modalities=["IMAGE", "TEXT"],
),
)
output_path = os.path.join(OUTPUT_DIR, f"fig_NAME_attempt{attempt_num}.png")
for part in response.candidates[0].content.parts:
if part.inline_data:
with open(output_path, "wb") as f:
f.write(part.inline_data.data)
print(f"Saved: {output_path} ({os.path.getsize(output_path):,} bytes)")
return output_path
elif part.text:
print(f"Text: {part.text[:300]}")
print("WARNING: No image in response")
return None
except Exception as e:
print(f"ERROR: {e}")
return None
def main():
results = []
for i in range(1, 4):
if i > 1:
time.sleep(2)
path = generate_image(PROMPT, i)
if path:
results.append(path)
if not results:
print("All attempts failed!")
sys.exit(1)
print(f"
Generated {len(results)} attempts. Review and pick the best.")
if __name__ == "__main__":
main()
Key Rules
Always 3 attempts — quality varies significantly between runs
Style block is mandatory — without it, Gemini defaults to generic corporate look
Never hardcode API keys — use os.environ.get("GEMINI_API_KEY")
Save generation scripts — reproducibility is critical
Specify every label exactly — Gemini may misspell or rearrange text