Back to skills
extension
Category: OtherNo API key required

nature-figure

Generate publication-quality figures for Nature-series journals using Python (matplotlib) or R (ggplot2). Trigger when user wants to create, polish, or redes...

personAuthor: yang1baihubclawhub

nature-figure

Purpose

Generate multi-panel scientific figures that meet Nature portfolio visual standards: correct typography, semantic colour palette, accessible design, and editable SVG output.


Trigger Conditions

Activate when user mentions:

  • "画图" / "figure" / "plot" / "科研绘图"
  • "Nature figure" / "publication figure" / "publication plot"
  • "matplotlib" / "ggplot" / "seaborn"
  • "配色" / "color palette" / "color scheme"
  • Wants to improve or reformat an existing figure

Nature Figure Standards

Typography

  • Font family: Arial or Helvetica (sans-serif, never Times New Roman in figures)
  • Minimum font size in final print: 7 pt (axis labels, tick labels)
  • Panel labels (a, b, c...): 8 pt bold, lowercase
  • Figure title (if any): not embedded in figure — goes in legend
  • All text must be editable (not rasterized)

Size & Resolution

| Format | Width | Resolution | |--------|-------|------------| | Single column | 89 mm (3.5 in) | 300 DPI min | | 1.5 column | 120 mm (4.7 in) | 300 DPI min | | Double column | 183 mm (7.2 in) | 300 DPI min | | Line art | any | 600 DPI | | Final submission | PDF or TIFF | vector preferred |

Colour Palette (Nature-approved, colorblind-safe)

NATURE_COLORS = {
    "blue":    "#4878CF",
    "red":     "#D65F5F", 
    "green":   "#6ACC65",
    "orange":  "#EE854A",
    "purple":  "#956CB4",
    "teal":    "#82C6E2",
    "brown":   "#D5BB67",
    "gray":    "#8C8C8C",
    # Colorblind-safe primary pair:
    "cb_blue": "#0072B2",
    "cb_orange":"#E69F00",
}
  • Never use pure red + green together (colorblind conflict)
  • Use filled symbols + different shapes for accessibility, not colour alone
  • Grayscale must remain distinguishable

Panel Architecture

  • Each panel makes one clear point
  • Panel (a): overview / schematic / representative image
  • Panels (b–d): quantitative evidence
  • Final panel: comparison or generalizability
  • Panels are labelled a, b, c (lowercase bold, top-left corner)
  • White background; minimal gridlines (light gray, 0.5pt)
  • No chartjunk: remove top and right spines

Statistical Annotations

  • Error bars: always define in legend (mean ± s.d. or ± s.e.m.)
  • Significance: *, **, ***, **** for p < 0.05, 0.01, 0.001, 0.0001; prefer exact p-values
  • n must be stated (e.g., n = 5 independent experiments)
  • Box plots: show median, IQR, whiskers to 1.5×IQR, individual points overlaid

Workflow

Step 0: Auto-figure from data file (fastest path)

If user provides a CSV, Excel, or JSON data file:

python3 ~/.openclaw/workspace/skills/nature-paper-hub/scripts/auto_figure.py \
  --input <data_file> \
  --output ~/Downloads/figure_<date>.pdf \
  --title "[figure title]" \
  --xlabel "X axis label" \
  --ylabel "Y axis label" \
  --type [auto|line|bar|scatter|heatmap|box]

The script auto-detects column types, chooses appropriate chart type, applies Nature style, and saves PDF + PNG.

Step 1: Gather requirements (if no data file yet)

Ask the user:

  1. What data do you have? (paste CSV, describe columns, or share values)
  2. How many panels? What does each panel show?
  3. Single/1.5/double column width?
  4. Python (matplotlib/seaborn) or R (ggplot2)?
  5. Any specific colour requirements or journal sub-style?

Step 2: Generate figure code

Python template (matplotlib):

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

# --- Nature style settings ---
plt.rcParams.update({
    'font.family': 'Arial',
    'font.size': 8,
    'axes.linewidth': 0.8,
    'axes.spines.top': False,
    'axes.spines.right': False,
    'xtick.major.width': 0.8,
    'ytick.major.width': 0.8,
    'xtick.major.size': 3,
    'ytick.major.size': 3,
    'xtick.direction': 'out',
    'ytick.direction': 'out',
    'figure.dpi': 300,
    'savefig.dpi': 300,
    'savefig.bbox': 'tight',
    'savefig.pad_inches': 0.05,
    'pdf.fonttype': 42,   # editable text in PDF
    'ps.fonttype': 42,
})

COLORS = {
    "blue": "#4878CF", "red": "#D65F5F", "green": "#6ACC65",
    "orange": "#EE854A", "purple": "#956CB4", "teal": "#82C6E2",
    "cb_blue": "#0072B2", "cb_orange": "#E69F00",
}

# --- Figure layout ---
fig = plt.figure(figsize=(7.2, 4.0))  # double column, adjust height
gs = gridspec.GridSpec(1, 3, figure=fig, wspace=0.4, hspace=0.4)

ax_a = fig.add_subplot(gs[0])
ax_b = fig.add_subplot(gs[1])
ax_c = fig.add_subplot(gs[2])

# --- Panel labels ---
for ax, label in zip([ax_a, ax_b, ax_c], ['a', 'b', 'c']):
    ax.text(-0.15, 1.05, label, transform=ax.transAxes,
            fontsize=8, fontweight='bold', va='top', ha='right')

# --- YOUR DATA GOES HERE ---
# ax_a: ...
# ax_b: ...
# ax_c: ...

plt.savefig('figure1.pdf', format='pdf')
plt.savefig('figure1.png', dpi=300)
print("Saved: figure1.pdf, figure1.png")

R template (ggplot2):

library(ggplot2)
library(patchwork)

# Nature theme
theme_nature <- function() {
  theme_classic(base_size = 8, base_family = "Arial") +
  theme(
    axis.line = element_line(linewidth = 0.5),
    axis.ticks = element_line(linewidth = 0.5),
    axis.ticks.length = unit(2, "pt"),
    strip.background = element_blank(),
    legend.key.size = unit(3, "mm"),
    plot.margin = margin(2, 2, 2, 2, "mm")
  )
}

nature_colors <- c(
  blue = "#4878CF", red = "#D65F5F", green = "#6ACC65",
  orange = "#EE854A", purple = "#956CB4", teal = "#82C6E2"
)

# --- YOUR PLOTS ---
# p1 <- ggplot(...) + theme_nature()
# p2 <- ggplot(...) + theme_nature()
# combined <- p1 | p2
# ggsave("figure1.pdf", combined, width = 183, height = 80, units = "mm", dpi = 300)

Step 3: Validate

Before outputting, check:

  • [ ] Font ≥ 7pt in all elements
  • [ ] No top/right spines
  • [ ] Colorblind-safe palette used
  • [ ] Error bars defined
  • [ ] Panel labels present (a, b, c lowercase bold)
  • [ ] Resolution ≥ 300 DPI (600 for line art)
  • [ ] Figure width matches column format
  • [ ] PDF/SVG output for vector editability

Step 4: Figure legend

Generate the corresponding figure legend text:

  • Bold "Figure X |" prefix
  • Short title (one phrase)
  • One sentence per panel
  • Error bar definition
  • n values and statistical test used
  • Scale bar definition (for images)

Common Figure Types

Line plot (time series / trends)

Use solid lines with markers; different line styles + colours for groups.

Bar chart

Prefer horizontal bars for many categories; overlay individual data points. Use plt.bar() with edgecolor='black', linewidth=0.5.

Scatter plot

Include regression line with 95% CI if showing correlation. State Pearson/Spearman r and p-value on plot.

Heatmap

Use diverging colourmap (e.g., RdBu_r) for correlation; sequential for intensity. Always include colourbar with label and units.

Box/Violin plot

Always overlay individual data points (stripplot or geom_jitter). State n per group.

Schematic / Mechanism diagram

Recommend using BioRender (biorender.com) or Inkscape for schematics. Export as SVG and embed in figure.


Output

Provide the user with:

  1. Complete, runnable Python or R code
  2. Instructions to save in the correct format (PDF + PNG)
  3. The figure legend text
  4. A checklist of what to verify before submission