Claude
Skills
Sign in
Back

nature-academic-skills

Included with Lifetime
$97 forever

```markdown

Writing & Docs

What this skill does

```markdown
---
name: nature-academic-skills
description: Generate publication-ready Nature-journal matplotlib figures and polish academic prose to Nature style standards using Claude skills.
triggers:
  - "create a Nature figure"
  - "make a publication-ready plot"
  - "polish this academic writing to Nature style"
  - "scientific figure for my paper"
  - "Nature journal manuscript polishing"
  - "multi-panel matplotlib figure"
  - "academic prose editing Nature standard"
  - "convert draft to Nature style writing"
---

# Nature Academic Skills

> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.

A collection of Claude skills for producing academic work at *Nature*-journal standard — covering scientific figures (`nature-figure`) and manuscript prose polishing (`nature-polishing`).

---

## What This Project Does

`nature-skills` provides two stable skills that enforce rules derived from **primary sources** (published *Nature* papers, official author guidelines, structured writing curricula):

| Skill | Purpose |
|-------|---------|
| `nature-figure` | Multi-panel matplotlib figures matching *Nature* visual standards |
| `nature-polishing` | Academic prose polishing to *Nature* prose conventions |

---

## Installation

### For Claude Code / Cursor / Codex agents

Clone the repository into your project's `.claude/skills/` or equivalent skills directory:

```bash
git clone https://github.com/Yuan1z0825/nature-skills.git .claude/skills/nature-skills
```

Or copy the relevant `SKILL.md` files directly into your agent's context:

```bash
# For figure generation only
cp nature-skills/nature-figure/SKILL.md .claude/skills/nature-figure.md

# For prose polishing only
cp nature-skills/nature-polishing/SKILL.md .claude/skills/nature-polishing.md
```

The agent will automatically load `SKILL.md` files from its skills directory and activate the appropriate skill based on trigger keywords.

### Python dependencies (for nature-figure)

```bash
pip install matplotlib numpy scipy
```

Optional for SVG post-processing:

```bash
pip install cairosvg   # SVG → PDF conversion
pip install svgutils   # panel assembly
```

---

## Skill 1: nature-figure

### Trigger phrases

"Nature figure", "publication plot", "scientific figure", "multi-panel figure"

### Mandatory rcParams (always include first)

```python
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

# REQUIRED: must appear before any figure creation
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans', 'Liberation Sans']
plt.rcParams['svg.fonttype'] = 'none'  # text stays as <text> nodes, not paths
```

### Output policy

```python
# Primary output: SVG (always)
fig.savefig('figure1.svg', bbox_inches='tight', dpi=300)

# Secondary output: PNG raster preview (always include alongside SVG)
fig.savefig('figure1.png', bbox_inches='tight', dpi=300)
```

### Nature colour palette

```python
NATURE_PALETTE = {
    'blue':       '#4878CF',
    'green':      '#6ACC65',
    'red':        '#D65F5F',
    'purple':     '#B47CC7',
    'cyan':       '#77BEDB',
    'orange':     '#EE854A',
    'pink':       '#D0759F',
    'yellow':     '#C4AD66',
    'light_blue': '#8ABBE5',
    'dark_green': '#3A9E5F',
}

COLORS = list(NATURE_PALETTE.values())
```

### Typography rules

| Element | Size | Weight |
|---------|------|--------|
| Panel label (a, b, c…) | 8 pt | bold |
| Axis title | 7 pt | normal |
| Tick labels | 6 pt | normal |
| Legend text | 6 pt | normal |
| Figure title (if any) | 8 pt | bold |

```python
FONT_SIZES = {
    'panel_label': 8,
    'axis_title':  7,
    'tick_label':  6,
    'legend':      6,
}
```

### Complete multi-panel figure example

```python
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

# --- Mandatory rcParams ---
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans', 'Liberation Sans']
plt.rcParams['svg.fonttype'] = 'none'

NATURE_PALETTE = {
    'blue':   '#4878CF',
    'green':  '#6ACC65',
    'red':    '#D65F5F',
    'orange': '#EE854A',
}
COLORS = list(NATURE_PALETTE.values())

# --- Figure layout (Nature single-column: 89 mm; double: 183 mm) ---
fig = plt.figure(figsize=(7.2, 4.0))  # 183 mm wide ≈ 7.2 inches
gs = gridspec.GridSpec(1, 3, figure=fig, wspace=0.45, hspace=0.4)

# Panel a: bar chart (overview)
ax_a = fig.add_subplot(gs[0, 0])
categories = ['Control', 'Treatment A', 'Treatment B']
values = [0.42, 0.67, 0.81]
errors = [0.05, 0.04, 0.06]
bars = ax_a.bar(categories, values, color=COLORS[:3],
                width=0.6, linewidth=0.8, edgecolor='white')
ax_a.errorbar(categories, values, yerr=errors,
              fmt='none', color='black', capsize=3, linewidth=0.8)
ax_a.set_ylabel('Accuracy', fontsize=7)
ax_a.set_ylim(0, 1.0)
ax_a.tick_params(labelsize=6)
ax_a.spines['top'].set_visible(False)
ax_a.spines['right'].set_visible(False)
ax_a.text(-0.18, 1.05, 'a', transform=ax_a.transAxes,
          fontsize=8, fontweight='bold', va='top')

# Panel b: trend lines (deviation)
ax_b = fig.add_subplot(gs[0, 1])
epochs = np.arange(1, 51)
for i, label in enumerate(['Model A', 'Model B', 'Model C']):
    loss = 1.0 * np.exp(-0.08 * epochs) + 0.05 * np.random.randn(50) * 0
    loss = 1.0 * np.exp(-0.08 * epochs) + i * 0.05
    ax_b.plot(epochs, loss, color=COLORS[i], linewidth=1.2, label=label)
ax_b.set_xlabel('Epoch', fontsize=7)
ax_b.set_ylabel('Loss', fontsize=7)
ax_b.tick_params(labelsize=6)
ax_b.legend(fontsize=6, frameon=False, loc='upper right')
ax_b.spines['top'].set_visible(False)
ax_b.spines['right'].set_visible(False)
ax_b.text(-0.18, 1.05, 'b', transform=ax_b.transAxes,
          fontsize=8, fontweight='bold', va='top')

# Panel c: scatter (relationship)
ax_c = fig.add_subplot(gs[0, 2])
np.random.seed(42)
x = np.random.randn(60)
y = 0.7 * x + 0.5 * np.random.randn(60)
ax_c.scatter(x, y, color=COLORS[0], alpha=0.7, s=18,
             linewidths=0.3, edgecolors='white')
m, b = np.polyfit(x, y, 1)
xline = np.linspace(x.min(), x.max(), 100)
ax_c.plot(xline, m * xline + b, color=COLORS[2], linewidth=1.2, linestyle='--')
ax_c.set_xlabel('Feature score', fontsize=7)
ax_c.set_ylabel('Outcome', fontsize=7)
ax_c.tick_params(labelsize=6)
ax_c.spines['top'].set_visible(False)
ax_c.spines['right'].set_visible(False)
ax_c.text(-0.18, 1.05, 'c', transform=ax_c.transAxes,
          fontsize=8, fontweight='bold', va='top')

plt.savefig('figure1.svg', bbox_inches='tight', dpi=300)
plt.savefig('figure1.png', bbox_inches='tight', dpi=300)
plt.show()
```

### Supported chart types

| Type | Use case |
|------|----------|
| Stacked / grouped bar | Comparing categories with subgroups |
| Horizontal ablation bar | Ablation studies, feature importance |
| Trend / line | Training curves, time-series |
| Sequential heatmap | Expression matrices, correlation |
| Diverging z-score heatmap | Z-score, signed deviation from mean |
| Bubble scatter | Three-variable relationships |
| Radar / polar | Multi-metric model comparison |
| 3D sphere illustration | Conceptual/anatomical diagrams |
| Fill-between area | Confidence intervals, variance bands |
| Log-scale bar | Dynamic-range comparisons |
| GridSpec multi-panel | Combined overview figures |

### Three-level panel information hierarchy

```
Overview  →  Deviation  →  Relationship
   (a)           (b)            (c)
```

**Rule:** No two panels may answer the same scientific question.

---

## Skill 2: nature-polishing

### Trigger phrases

"Nature style", "polish", "academic writing", "manuscript editing"

### 12-step polishing workflow

```
1. Sentence split       — Split into individual sentences; count words each
2. Section ID           — Identify section: Abstract / Intro / Results / Discussion / Methods
3. Hourglass check      — Verify structure follows broad → specific → broad
4. Tense audit          — Results = past; Discussion = hedging present; Methods = past
5. Sentence edit  

Related in Writing & Docs