Scientific figures
Skill rhowardstone/Claude-Code-Scientist/.claude/skills/scientific-figures
Transform Claude Code into a semi-autonomous, self-improving scientific researcher. Literature review, data acquisition, experimentation, synthesis, peer review
npx -y skills add rhowardstone/Claude-Code-Scientist --skill scientific-figuresAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Generate publication-quality scientific figures with consistent styling. Use when experiments need visualization, benchmarking results need plots, or papers need figures.
SKILL.md
4.7 KB, as published. Nobody here has run it
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.