nature-figure

Other

Generate publication-quality figures for Nature-series journals using Python (matplotlib) or R (ggplot2). Trigger when user wants to create, polish, or redesign scientific figures for high-impact journals. Handles multi-panel layouts, Nature color palettes, correct typography, and exports SVG/PDF/PNG.

Install

openclaw skills install nature-figure

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

FormatWidthResolution
Single column89 mm (3.5 in)300 DPI min
1.5 column120 mm (4.7 in)300 DPI min
Double column183 mm (7.2 in)300 DPI min
Line artany600 DPI
Final submissionPDF or TIFFvector 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