Claude-Code-Scientist scientific-figures

Generate publication-quality scientific figures with consistent styling. Use when experiments need visualization, benchmarking results need plots, or papers need figures.

install
source · Clone the upstream repo
git clone https://github.com/rhowardstone/Claude-Code-Scientist
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/rhowardstone/Claude-Code-Scientist "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/scientific-figures" ~/.claude/skills/rhowardstone-claude-code-scientist-scientific-figures && rm -rf "$T"
manifest: .claude/skills/scientific-figures/SKILL.md
source content

Scientific Figures Skill

Generate publication-quality visualizations for experimental results.

When to Use

  • After running experiments that produce numerical results
  • When synthesizing papers that need figures
  • When benchmarking tools and need ROC/PR curves, bar plots, etc.
  • When visualizing data distributions (violin plots, histograms)
  • When creating graphical abstracts

Output Requirements

ALWAYS generate both formats:

  • PNG at 300 DPI (for web/preview)
  • PDF vector (for publication)

ALWAYS include:

  • Clear axis labels with units
  • Legends when multiple series
  • Panel labels (A, B, C, D) for multi-panel figures
  • Figure titles
  • Consistent color scheme

Standard Figure Types

1. Performance Metrics (Benchmarking)

import matplotlib.pyplot as plt
import seaborn as sns

# Set consistent style
plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# Panel A: ROC curves
axes[0].set_title('A. ROC Curves', fontsize=12, fontweight='bold')
axes[0].set_xlabel('False Positive Rate')
axes[0].set_ylabel('True Positive Rate')
axes[0].plot([0, 1], [0, 1], 'k--', label='Random')

# Panel B: Bar comparison
axes[1].set_title('B. Performance Comparison', fontsize=12, fontweight='bold')

plt.tight_layout()
plt.savefig('figure.png', dpi=300, bbox_inches='tight')
plt.savefig('figure.pdf', bbox_inches='tight')

2. Distribution Plots (QC, Score Distributions)

fig, axes = plt.subplots(1, 3, figsize=(15, 4))

for ax, (data, title) in zip(axes, [(d1, 'Metric A'), (d2, 'Metric B'), (d3, 'Metric C')]):
    sns.violinplot(data=data, ax=ax)
    ax.set_title(title)

plt.savefig('qc_metrics.png', dpi=300, bbox_inches='tight')
plt.savefig('qc_metrics.pdf', bbox_inches='tight')

3. Confusion Matrices

from sklearn.metrics import confusion_matrix
import numpy as np

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

for ax, (cm, title) in zip(axes, [(cm1, 'A. Method 1'), (cm2, 'B. Method 2')]):
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=ax,
                xticklabels=['Pred Neg', 'Pred Pos'],
                yticklabels=['True Neg', 'True Pos'])
    ax.set_title(title, fontsize=12, fontweight='bold')

plt.tight_layout()

4. UMAP/Scatter Plots

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

scatter1 = axes[0].scatter(umap[:, 0], umap[:, 1], c=labels, cmap='tab20', s=5, alpha=0.7)
axes[0].set_title('A. Cell Types')
axes[0].legend(*scatter1.legend_elements(), loc='best', markerscale=2)

scatter2 = axes[1].scatter(umap[:, 0], umap[:, 1], c=scores, cmap='coolwarm', s=5, alpha=0.7)
axes[1].set_title('B. Doublet Scores')
plt.colorbar(scatter2, ax=axes[1])

5. Graphical Abstract

For synthesis papers, create a workflow diagram:

# Use matplotlib patches and arrows for simple workflow diagrams
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch

fig, ax = plt.subplots(figsize=(12, 6))
ax.set_xlim(0, 12)
ax.set_ylim(0, 6)
ax.axis('off')

# Add boxes for each step
steps = [
    (1, 3, 'Input\nData'),
    (4, 3, 'Method A'),
    (7, 3, 'Method B'),
    (10, 3, 'Results'),
]

for x, y, text in steps:
    box = FancyBboxPatch((x-0.8, y-0.5), 1.6, 1,
                         boxstyle="round,pad=0.1", facecolor='lightblue',
                         edgecolor='black', linewidth=2)
    ax.add_patch(box)
    ax.text(x, y, text, ha='center', va='center', fontsize=10, fontweight='bold')

Color Schemes

Default categorical:

sns.color_palette("husl", n_colors)
Sequential:
"Blues"
,
"Greens"
,
"Oranges"
Diverging:
"coolwarm"
,
"RdBu_r"

Figure Naming Convention

figures/
├── 01_qc_metrics.png
├── 01_qc_metrics.pdf
├── 02_method_comparison.png
├── 02_method_comparison.pdf
├── 03_roc_pr_curves.png
├── 03_roc_pr_curves.pdf
├── graphical_abstract.png
└── graphical_abstract.pdf

Checklist Before Saving

  • Both PNG and PDF generated
  • All axes labeled
  • Legend present if needed
  • Panel labels (A, B, C) added
  • Font sizes readable (min 10pt)
  • Colors colorblind-friendly
  • tight_layout() called
  • DPI=300 for PNG

Integration with Papers

When writing LaTeX papers, reference figures:

\begin{figure}[htbp]
\centering
\includegraphics[width=\textwidth]{figures/01_qc_metrics.pdf}
\caption{\textbf{Quality Control Metrics.} (A) UMI counts per cell...}
\label{fig:qc}
\end{figure}

K-Dense produced 8 beautiful figures. We must match or exceed that quality.