← Back to skills
extension
Category: Data & AnalyticsNo API key required

科研绘图

Covers publication-ready matplotlib figures for academic papers, slides, and reports—bars, trends, scatter, heatmaps, and multi-panel layouts—with this repository’s house style, print/vector export conventions, and parity with figures4papers demos. Use when the user is finalizing or creating such figures in matplotlib. Do not use for interactive dashboards or web viz (Plotly, Altair, Bokeh), exploratory-only plots without a publication target, dominant 3D or geographic mapping, or Illustrator/Figma-first infographic workflows.

personAuthor: user_fa89a4f1hubcommunity

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