Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when writing matplotlib/seaborn code for a scientific figure: apply the exact publication house style (Okabe-Ito hex cycle, vector PDF @300dpi, despine, journal mm widths) the base would not use by default.
.claude/skills/publication-figure-conventions/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 2 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +41% | +68% | 0% | 22 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-06 | ✗→✓ | ▲ Improved | — | — |
| case-10 | ✗→✓ | ▲ Improved | — | — |
Enforces the lab's publication house style on every matplotlib/seaborn figure: a fixed Okabe-Ito color cycle, perceptually-uniform colormaps, explicit journal widths, vector PDF export at 300 dpi, despining, sentence-case labels with units, and named uncertainty. Apply whenever generating figure code intended for a manuscript, journal submission, or paper. These are non-negotiable overrides of library defaults — the base model would otherwise emit tab10 colors, a 6.4x4.8 figure, a framed legend, and a 100-dpi PNG.
THIS order, then install them as the prop cycle: python okabe_ito = ['#E69F00', '#56B4E9', '#009E73', '#F0E442', '#0072B2', '#D55E00', '#CC79A7', '#000000'] plt.rcParams['axes.prop_cycle'] = plt.cycler(color=okabe_ito) Never rely on the default tab10 cycle. The order is fixed (orange first, sky-blue second).
colormap — viridis, plasma, or cividis. NEVER jet or rainbow.
cmap='RdBu_r' with center=0.NEVER a red-green diverging map.
linestyle and/or marker per series, not color alone.
figsize explicitly. Single-column default is (3.5, 2.5) inches.Convert mm to inches by dividing by 25.4.
dpi=300 with tight bounding box:fig.savefig('figure1.pdf', dpi=300, bbox_inches='tight'). Also acceptable: EPS, SVG. NEVER JPEG/JPG for plots or line art (compression artifacts). TIFF/PNG only for photos.
ax.spines['top'].set_visible(False); ax.spines['right'].set_visible(False) — or sns.despine().
ax.set_xlabel('Time (hours)'),ax.set_ylabel('Response (uM)'). Never ALL-CAPS, never unit-less.
ax.legend(frameon=False).coordinates: ax.text(-0.15, 1.05, 'A', transform=ax.transAxes, fontsize=10, fontweight='bold').
(SD, SEM, or 95% CI) in a comment, label, or caption. Show individual points when feasible.
BEFORE:
pythonax.plot(x, y1, label='control') # tab10 blue ax.plot(x, y2, label='treated') # tab10 orange
AFTER:
pythonokabe_ito = ['#E69F00', '#56B4E9', '#009E73', '#F0E442', '#0072B2', '#D55E00', '#CC79A7', '#000000'] plt.rcParams['axes.prop_cycle'] = plt.cycler(color=okabe_ito) ax.plot(x, y1, label='control') # now #E69F00 ax.plot(x, y2, label='treated') # now #56B4E9
BEFORE: ax.imshow(arr, cmap='jet'); fig.colorbar(...) AFTER: im = ax.imshow(arr, cmap='viridis'); fig.colorbar(im, ax=ax)
BEFORE: sns.heatmap(df.corr(), cmap='coolwarm') (uncentered, generic) AFTER: sns.heatmap(df.corr(), cmap='RdBu_r', center=0, annot=True, fmt='.2f', square=True)
BEFORE: fig, ax = plt.subplots() (6.4 x 4.8 in default) AFTER: fig, ax = plt.subplots(figsize=(3.5, 2.5)) # single column For a Nature double-column figure: figsize=(183/25.4, 4) # 183 mm ≈ 7.2 in
BEFORE: fig.savefig('fig.png') (raster, ~100 dpi) AFTER: fig.savefig('figure1.pdf', dpi=300, bbox_inches='tight')
BEFORE: (all four spines drawn) AFTER: ax.spines['top'].set_visible(False); ax.spines['right'].set_visible(False)
BEFORE: ax.set_xlabel('TIME'); ax.set_ylabel('amplitude') AFTER: ax.set_xlabel('Time (hours)'); ax.set_ylabel('Amplitude (mV)')
BEFORE: ax.legend() (framed box) AFTER: ax.legend(frameon=False)
BEFORE: ax.set_title('1') (numeric, inside title) AFTER: ax.text(-0.15, 1.05, 'A', transform=ax.transAxes, fontsize=10, fontweight='bold')
BEFORE: ax.bar(conditions, means) (no error) AFTER:
pythonax.errorbar(conditions, means, yerr=sems, fmt='o', capsize=3) # error bars = SEM
BEFORE: four lines distinguished by color only. AFTER:
pythonstyles, marks = ['-', '--', '-.', ':'], ['o', 's', '^', 'v'] for i, (yy, lbl) in enumerate(series): ax.plot(x, yy, linestyle=styles[i], marker=marks[i], label=lbl) # color from Okabe-Ito cycle
encoding rather than inventing a 9th color, or split into panels.
UPPERCASE unless the target is explicitly Nature.
(fig.write_image('figure.png', scale=3) ≈ 300 dpi); the interactive version is not the deliverable.
viridis, NOT RdBu_r —RdBu_r + center=0 is only for signed/diverging data.
rule is for plots and line art, not pixel images.
viridis/plasma/cividis; NEVER use jet or rainbow.RdBu_r; NEVER use red-green diverging colors.figsize explicitly; DON'T accept the 6.4x4.8 default.dpi=300; NEVER save plots as JPEG.'Time (hours)'; DON'T write 'TIME' or a unit-less label.frameon=False; DON'T leave the boxed legend.jet/rainbow/coolwarm for heatmaps.center=0 (misleading neutral point).figsize, producing an oversized 6.4x4.8 figure..png at default dpi, or worse .jpg, for a line plot.Okabe-Ito cycle - viridis/RdBu_r(center=0) not jet - explicit figsize / journal mm - vector PDF @300 not JPEG - despine top+right - sentence-case labels with units - legend frameon=False - bold-uppercase panel labels in axes coords - named uncertainty - redundant encoding for colorblind.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 7/9/2026 | +25% |
Other measured skills in the registry, with their headline benchmark lift.