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:
- What data do you have? (paste CSV, describe columns, or share values)
- How many panels? What does each panel show?
- Single/1.5/double column width?
- Python (matplotlib/seaborn) or R (ggplot2)?
- 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:
- Complete, runnable Python or R code
- Instructions to save in the correct format (PDF + PNG)
- The figure legend text
- A checklist of what to verify before submission
Scan to contact