
Academic Plotting
Generate publication-ready ML paper figures with matplotlib/seaborn defaults, palettes, and layout patterns instead of generic chart styling.
Install
npx skills add https://github.com/orchestra-research/ai-research-skills --skill academic-plottingWhat is this skill?
- Complete pattern library for polished, distinctive ML paper figures
- Publication rcParams block: 300 DPI, serif fonts, subtle grid, spine styling
- Default Ocean Dusk color palette with named teal and companion hues
- Seaborn and matplotlib tick/legend conventions tuned for print
- Copy-paste setup imports for numpy, mpl, and FuncFormatter formatters
Adoption & trust: 1 installs on skills.sh; 9.4k GitHub stars; 3/3 security scanners passed (skills.sh audits).
Recommended Skills
Paper Context Resolverlllllllama/ai-paper-reproduction-skill
Repo Intake And Planlllllllama/ai-paper-reproduction-skill
Env And Assets Bootstraplllllllama/ai-paper-reproduction-skill
Minimal Run And Auditlllllllama/ai-paper-reproduction-skill
Analyze Projectlllllllama/rigorpilot-skills
Ai Research Reproductionlllllllama/rigorpilot-skills
Journey fit
Primary fit
Figure production happens while building the research artifact (paper, report, benchmark write-up), not during initial idea validation alone. Docs subphase is the right shelf because output is camera-ready figures and rcParams for manuscripts.
Common Questions / FAQ
Is Academic Plotting safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Academic Plotting
# Data Visualization Patterns for ML Papers Complete pattern library for generating polished, distinctive figures. ## Setup and Imports ```python import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np import seaborn as sns from matplotlib.ticker import MaxNLocator, FuncFormatter # --- Publication defaults (polished, not generic) --- plt.rcParams.update({ "font.family": "serif", "font.serif": ["Times New Roman", "DejaVu Serif"], "font.size": 10, "axes.titlesize": 11, "axes.titleweight": "bold", "axes.labelsize": 10, "axes.labelweight": "medium", "xtick.labelsize": 8.5, "ytick.labelsize": 8.5, "legend.fontsize": 8.5, "legend.frameon": False, "figure.dpi": 300, "savefig.dpi": 300, "savefig.bbox": "tight", "savefig.pad_inches": 0.08, "axes.spines.top": False, "axes.spines.right": False, "axes.linewidth": 0.8, "xtick.major.width": 0.8, "ytick.major.width": 0.8, "axes.grid": True, "grid.alpha": 0.15, # Very subtle — guides the eye without competing "grid.linewidth": 0.6, "grid.linestyle": "-", # Solid but faint, not dashed (less visual noise) "lines.linewidth": 1.8, "lines.markersize": 5, "patch.edgecolor": "white", # White borders between bars (cleaner look) "patch.linewidth": 0.5, }) ``` ## Color Palettes ### "Ocean Dusk" (default — professional, distinctive) ```python COLORS = { "teal": "#264653", # deep, authoritative "cyan": "#2A9D8F", # fresh, modern "gold": "#E9C46A", # warm accent "orange": "#F4A261", # energetic "coral": "#E76F51", # standout (use for "our method") "blue": "#0072B2", # Okabe-Ito accessible blue "sky": "#56B4E9", # Okabe-Ito accessible sky "gray": "#8C8C8C", # neutral baseline } COLOR_LIST = list(COLORS.values()) # Semantic colors for highlighting OUR_COLOR = "#E76F51" # coral — warm, draws attention BASELINE_COLOR = "#B0BEC5" # cool gray — recedes BEST_BASELINE = "#264653" # deep teal — strongest competitor ``` ### "Okabe-Ito" (maximum colorblind safety) ```python OKABE_ITO = ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#000000"] ``` ### Sequential Palettes (for heatmaps) ```python # Warm sequential (more interesting than plain Blues) cmap_warm = sns.color_palette("YlOrRd", as_cmap=True) # Cool sequential (clean, professional) cmap_cool = sns.light_palette("#264653", as_cmap=True) # Diverging (for correlation/difference, centered at 0) cmap_div = sns.color_palette("RdBu_r", as_cmap=True) # Perceptually uniform (for continuous scientific data) cmap_viridis = plt.cm.viridis ``` ### Making Charts Visually Distinctive Common mistakes that make charts look "boring" and their fixes: | Boring Default | Better Version | |---------------|---------------| | Black lines, no markers | Colored lines + distinct markers per method | | No shading around lines | Confidence bands with `fill_between(alpha=0.12)` | | Generic blue bars | "Ocean Dusk" palette + white edge between bars | | All same color baselines | Gray baselines + coral highlight for "ours" | | Dashed grid lines | Very faint solid grid (`alpha=0.15`) | | Default tight spacing | `pad_inches=0.08`, generous axis margins | | No value labels on bars | Small value text above each bar | | Box legend with frame | Frameless legend, positioned inside plot area | ## Figure Sizes by Venue ```python # NeurIPS / ICLR (single column, 5.5in text width) FIG_NEURIPS_SINGLE = (5.5, 3.5) FIG_NEURIPS_HALF = (2.65, 2.5) # ICML (two column, 6.75in text width) FIG_ICML_SINGLE = (3.25, 2.5) FIG_ICML_FULL = (6.75, 2.5) # ACL (two column, 6.8in text width) FIG_ACL_SINGLE = (3.3, 2.5) FIG_ACL_FULL = (6.8, 3.0) # General safe default FIG_DEFAULT = (5, 3.5) ``` ## Chart Type 1: Training Curves (Line Plot) The most common figure in ML papers. Shows loss/accuracy over training steps. ```python def p