mirror of
https://github.com/K-Dense-AI/claude-scientific-skills.git
synced 2026-01-26 16:58:56 +08:00
449 lines
16 KiB
Markdown
449 lines
16 KiB
Markdown
---
|
|
name: scientific-visualization
|
|
description: "Create publication-ready scientific figures, plots, charts, and visualizations using matplotlib, seaborn, and plotly. Use this skill for any scientific data visualization task including: creating figures for research papers and manuscripts; preparing plots for journal submission (Nature, Science, Cell, PLOS, PNAS, etc.); making publication-quality figures with proper resolution, fonts, and formatting; ensuring colorblind accessibility and accessibility compliance; creating multi-panel figures with consistent styling; visualizing statistical data with error bars, significance markers, and proper statistical representation; exporting figures in correct formats (PDF, EPS, TIFF, PNG) with appropriate DPI; following journal-specific requirements and style guidelines; improving existing figures to meet publication standards; creating figures that work in both color and grayscale; visualizing experimental results, data analysis outputs, statistical comparisons, time series, distributions, correlations, heatmaps, scatter plots, bar charts, line plots, box plots, violin plots, and other scientific plot types; ensuring figures are clear, accurate, accessible, and professional; applying proper typography, color palettes, and layout principles; creating figures for presentations, posters, and scientific communication; visualizing genomics data, microscopy images, experimental measurements, and research findings."
|
|
---
|
|
|
|
# Scientific Visualization
|
|
|
|
## Overview
|
|
|
|
This skill provides comprehensive guidance, tools, and best practices for creating publication-ready scientific figures. It covers proper figure composition, colorblind-friendly design, journal-specific requirements, and practical implementation using matplotlib, seaborn, and plotly.
|
|
|
|
Publication-ready figures must be:
|
|
- **Clear**: Immediately understandable with proper labeling
|
|
- **Accurate**: Truthful data representation without distortion
|
|
- **Accessible**: Interpretable by readers with color vision deficiencies
|
|
- **Professional**: Polished appearance meeting journal standards
|
|
|
|
## When to Use This Skill
|
|
|
|
Activate this skill when:
|
|
- Creating plots or visualizations for scientific manuscripts
|
|
- Preparing figures for journal submission (Nature, Science, Cell, PLOS, etc.)
|
|
- Ensuring figures are colorblind-friendly and accessible
|
|
- Making multi-panel figures with consistent styling
|
|
- Exporting figures at correct resolution and format
|
|
- Following specific publication guidelines
|
|
- Improving existing figures to meet publication standards
|
|
- Creating figures that need to work in both color and grayscale
|
|
|
|
## Quick Start Guide
|
|
|
|
### Basic Publication-Quality Figure
|
|
|
|
```python
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
|
|
# Apply publication style (from scripts/style_presets.py)
|
|
from style_presets import apply_publication_style
|
|
apply_publication_style('default')
|
|
|
|
# Create figure with appropriate size (single column = 3.5 inches)
|
|
fig, ax = plt.subplots(figsize=(3.5, 2.5))
|
|
|
|
# Plot data
|
|
x = np.linspace(0, 10, 100)
|
|
ax.plot(x, np.sin(x), label='sin(x)')
|
|
ax.plot(x, np.cos(x), label='cos(x)')
|
|
|
|
# Proper labeling with units
|
|
ax.set_xlabel('Time (seconds)')
|
|
ax.set_ylabel('Amplitude (mV)')
|
|
ax.legend(frameon=False)
|
|
|
|
# Remove unnecessary spines
|
|
ax.spines['top'].set_visible(False)
|
|
ax.spines['right'].set_visible(False)
|
|
|
|
# Save in publication formats (from scripts/figure_export.py)
|
|
from figure_export import save_publication_figure
|
|
save_publication_figure(fig, 'figure1', formats=['pdf', 'png'], dpi=300)
|
|
```
|
|
|
|
### Using Pre-configured Styles
|
|
|
|
Apply journal-specific styles using the matplotlib style files in `assets/`:
|
|
|
|
```python
|
|
import matplotlib.pyplot as plt
|
|
|
|
# Option 1: Use style file directly
|
|
plt.style.use('assets/nature.mplstyle')
|
|
|
|
# Option 2: Use style_presets.py helper
|
|
from style_presets import configure_for_journal
|
|
configure_for_journal('nature', figure_width='single')
|
|
|
|
# Now create figures - they'll automatically match Nature specifications
|
|
fig, ax = plt.subplots()
|
|
# ... your plotting code ...
|
|
```
|
|
|
|
## Core Principles and Best Practices
|
|
|
|
### 1. Resolution and File Format
|
|
|
|
**Critical requirements** (detailed in `references/publication_guidelines.md`):
|
|
- **Raster images** (photos, microscopy): 300-600 DPI
|
|
- **Line art** (graphs, plots): 600-1200 DPI or vector format
|
|
- **Vector formats** (preferred): PDF, EPS, SVG
|
|
- **Raster formats**: TIFF, PNG (never JPEG for scientific data)
|
|
|
|
**Implementation:**
|
|
```python
|
|
# Use the figure_export.py script for correct settings
|
|
from figure_export import save_publication_figure
|
|
|
|
# Saves in multiple formats with proper DPI
|
|
save_publication_figure(fig, 'myfigure', formats=['pdf', 'png'], dpi=300)
|
|
|
|
# Or save for specific journal requirements
|
|
from figure_export import save_for_journal
|
|
save_for_journal(fig, 'figure1', journal='nature', figure_type='combination')
|
|
```
|
|
|
|
### 2. Color Selection - Colorblind Accessibility
|
|
|
|
**Always use colorblind-friendly palettes** (detailed in `references/color_palettes.md`):
|
|
|
|
**Recommended: Okabe-Ito palette** (distinguishable by all types of color blindness):
|
|
```python
|
|
# Option 1: Use assets/color_palettes.py
|
|
from color_palettes import OKABE_ITO_LIST, apply_palette
|
|
apply_palette('okabe_ito')
|
|
|
|
# Option 2: Manual specification
|
|
okabe_ito = ['#E69F00', '#56B4E9', '#009E73', '#F0E442',
|
|
'#0072B2', '#D55E00', '#CC79A7', '#000000']
|
|
plt.rcParams['axes.prop_cycle'] = plt.cycler(color=okabe_ito)
|
|
```
|
|
|
|
**For heatmaps/continuous data:**
|
|
- Use perceptually uniform colormaps: `viridis`, `plasma`, `cividis`
|
|
- Avoid red-green diverging maps (use `PuOr`, `RdBu`, `BrBG` instead)
|
|
- Never use `jet` or `rainbow` colormaps
|
|
|
|
**Always test figures in grayscale** to ensure interpretability.
|
|
|
|
### 3. Typography and Text
|
|
|
|
**Font guidelines** (detailed in `references/publication_guidelines.md`):
|
|
- Sans-serif fonts: Arial, Helvetica, Calibri
|
|
- Minimum sizes at **final print size**:
|
|
- Axis labels: 7-9 pt
|
|
- Tick labels: 6-8 pt
|
|
- Panel labels: 8-12 pt (bold)
|
|
- Sentence case for labels: "Time (hours)" not "TIME (HOURS)"
|
|
- Always include units in parentheses
|
|
|
|
**Implementation:**
|
|
```python
|
|
# Set fonts globally
|
|
import matplotlib as mpl
|
|
mpl.rcParams['font.family'] = 'sans-serif'
|
|
mpl.rcParams['font.sans-serif'] = ['Arial', 'Helvetica']
|
|
mpl.rcParams['font.size'] = 8
|
|
mpl.rcParams['axes.labelsize'] = 9
|
|
mpl.rcParams['xtick.labelsize'] = 7
|
|
mpl.rcParams['ytick.labelsize'] = 7
|
|
```
|
|
|
|
### 4. Figure Dimensions
|
|
|
|
**Journal-specific widths** (detailed in `references/journal_requirements.md`):
|
|
- **Nature**: Single 89 mm, Double 183 mm
|
|
- **Science**: Single 55 mm, Double 175 mm
|
|
- **Cell**: Single 85 mm, Double 178 mm
|
|
|
|
**Check figure size compliance:**
|
|
```python
|
|
from figure_export import check_figure_size
|
|
|
|
fig = plt.figure(figsize=(3.5, 3)) # 89 mm for Nature
|
|
check_figure_size(fig, journal='nature')
|
|
```
|
|
|
|
### 5. Multi-Panel Figures
|
|
|
|
**Best practices:**
|
|
- Label panels with bold letters: **A**, **B**, **C** (uppercase for most journals, lowercase for Nature)
|
|
- Maintain consistent styling across all panels
|
|
- Align panels along edges where possible
|
|
- Use adequate white space between panels
|
|
|
|
**Example implementation** (see `references/matplotlib_examples.md` for complete code):
|
|
```python
|
|
from string import ascii_uppercase
|
|
|
|
fig = plt.figure(figsize=(7, 4))
|
|
gs = fig.add_gridspec(2, 2, hspace=0.4, wspace=0.4)
|
|
|
|
ax1 = fig.add_subplot(gs[0, 0])
|
|
ax2 = fig.add_subplot(gs[0, 1])
|
|
# ... create other panels ...
|
|
|
|
# Add panel labels
|
|
for i, ax in enumerate([ax1, ax2, ...]):
|
|
ax.text(-0.15, 1.05, ascii_uppercase[i], transform=ax.transAxes,
|
|
fontsize=10, fontweight='bold', va='top')
|
|
```
|
|
|
|
## Common Tasks
|
|
|
|
### Task 1: Create a Publication-Ready Line Plot
|
|
|
|
See `references/matplotlib_examples.md` Example 1 for complete code.
|
|
|
|
**Key steps:**
|
|
1. Apply publication style
|
|
2. Set appropriate figure size for target journal
|
|
3. Use colorblind-friendly colors
|
|
4. Add error bars with correct representation (SEM, SD, or CI)
|
|
5. Label axes with units
|
|
6. Remove unnecessary spines
|
|
7. Save in vector format
|
|
|
|
### Task 2: Create a Multi-Panel Figure
|
|
|
|
See `references/matplotlib_examples.md` Example 2 for complete code.
|
|
|
|
**Key steps:**
|
|
1. Use `GridSpec` for flexible layout
|
|
2. Ensure consistent styling across panels
|
|
3. Add bold panel labels (A, B, C, etc.)
|
|
4. Align related panels
|
|
5. Verify all text is readable at final size
|
|
|
|
### Task 3: Create a Heatmap with Proper Colormap
|
|
|
|
See `references/matplotlib_examples.md` Example 4 for complete code.
|
|
|
|
**Key steps:**
|
|
1. Use perceptually uniform colormap (`viridis`, `plasma`, `cividis`)
|
|
2. Include labeled colorbar
|
|
3. For diverging data, use colorblind-safe diverging map (`RdBu_r`, `PuOr`)
|
|
4. Set appropriate center value for diverging maps
|
|
5. Test appearance in grayscale
|
|
|
|
### Task 4: Prepare Figure for Specific Journal
|
|
|
|
**Workflow:**
|
|
1. Check journal requirements: `references/journal_requirements.md`
|
|
2. Configure matplotlib for journal:
|
|
```python
|
|
from style_presets import configure_for_journal
|
|
configure_for_journal('nature', figure_width='single')
|
|
```
|
|
3. Create figure (will auto-size correctly)
|
|
4. Export with journal specifications:
|
|
```python
|
|
from figure_export import save_for_journal
|
|
save_for_journal(fig, 'figure1', journal='nature', figure_type='line_art')
|
|
```
|
|
|
|
### Task 5: Fix an Existing Figure to Meet Publication Standards
|
|
|
|
**Checklist approach** (full checklist in `references/publication_guidelines.md`):
|
|
|
|
1. **Check resolution**: Verify DPI meets journal requirements
|
|
2. **Check file format**: Use vector for plots, TIFF/PNG for images
|
|
3. **Check colors**: Ensure colorblind-friendly
|
|
4. **Check fonts**: Minimum 6-7 pt at final size, sans-serif
|
|
5. **Check labels**: All axes labeled with units
|
|
6. **Check size**: Matches journal column width
|
|
7. **Test grayscale**: Figure interpretable without color
|
|
8. **Remove chart junk**: No unnecessary grids, 3D effects, shadows
|
|
|
|
### Task 6: Create Colorblind-Friendly Visualizations
|
|
|
|
**Strategy:**
|
|
1. Use approved palettes from `assets/color_palettes.py`
|
|
2. Add redundant encoding (line styles, markers, patterns)
|
|
3. Test with colorblind simulator
|
|
4. Ensure grayscale compatibility
|
|
|
|
**Example:**
|
|
```python
|
|
from color_palettes import apply_palette
|
|
import matplotlib.pyplot as plt
|
|
|
|
apply_palette('okabe_ito')
|
|
|
|
# Add redundant encoding beyond color
|
|
line_styles = ['-', '--', '-.', ':']
|
|
markers = ['o', 's', '^', 'v']
|
|
|
|
for i, (data, label) in enumerate(datasets):
|
|
plt.plot(x, data, linestyle=line_styles[i % 4],
|
|
marker=markers[i % 4], label=label)
|
|
```
|
|
|
|
## Statistical Rigor
|
|
|
|
**Always include:**
|
|
- Error bars (SD, SEM, or CI - specify which in caption)
|
|
- Sample size (n) in figure or caption
|
|
- Statistical significance markers (*, **, ***)
|
|
- Individual data points when possible (not just summary statistics)
|
|
|
|
**Example with statistics:**
|
|
```python
|
|
# Show individual points with summary statistics
|
|
ax.scatter(x_jittered, individual_points, alpha=0.4, s=8)
|
|
ax.errorbar(x, means, yerr=sems, fmt='o', capsize=3)
|
|
|
|
# Mark significance
|
|
ax.text(1.5, max_y * 1.1, '***', ha='center', fontsize=8)
|
|
```
|
|
|
|
## Working with Different Plotting Libraries
|
|
|
|
### Matplotlib
|
|
- Most control over publication details
|
|
- Best for complex multi-panel figures
|
|
- Use provided style files for consistent formatting
|
|
- See `references/matplotlib_examples.md` for extensive examples
|
|
|
|
### Seaborn
|
|
- Built on matplotlib, inherits all matplotlib customizations
|
|
- Good for statistical plots
|
|
- Apply matplotlib styles first, then use seaborn
|
|
```python
|
|
import seaborn as sns
|
|
from style_presets import apply_publication_style
|
|
|
|
apply_publication_style('default')
|
|
sns.set_palette(['#E69F00', '#56B4E9', '#009E73']) # Okabe-Ito colors
|
|
```
|
|
|
|
### Plotly
|
|
- Interactive figures for exploration
|
|
- Export static images for publication
|
|
- Configure for publication quality:
|
|
```python
|
|
fig.update_layout(
|
|
font=dict(family='Arial, sans-serif', size=10),
|
|
plot_bgcolor='white',
|
|
# ... see matplotlib_examples.md Example 8
|
|
)
|
|
fig.write_image('figure.png', scale=3) # scale=3 gives ~300 DPI
|
|
```
|
|
|
|
## Resources
|
|
|
|
### References Directory
|
|
|
|
**Load these as needed for detailed information:**
|
|
|
|
- **`publication_guidelines.md`**: Comprehensive best practices
|
|
- Resolution and file format requirements
|
|
- Typography guidelines
|
|
- Layout and composition rules
|
|
- Statistical rigor requirements
|
|
- Complete publication checklist
|
|
|
|
- **`color_palettes.md`**: Color usage guide
|
|
- Colorblind-friendly palette specifications with RGB values
|
|
- Sequential and diverging colormap recommendations
|
|
- Testing procedures for accessibility
|
|
- Domain-specific palettes (genomics, microscopy)
|
|
|
|
- **`journal_requirements.md`**: Journal-specific specifications
|
|
- Technical requirements by publisher
|
|
- File format and DPI specifications
|
|
- Figure dimension requirements
|
|
- Quick reference table
|
|
|
|
- **`matplotlib_examples.md`**: Practical code examples
|
|
- 10 complete working examples
|
|
- Line plots, bar plots, heatmaps, multi-panel figures
|
|
- Journal-specific figure examples
|
|
- Tips for each library (matplotlib, seaborn, plotly)
|
|
|
|
### Scripts Directory
|
|
|
|
**Use these helper scripts for automation:**
|
|
|
|
- **`figure_export.py`**: Export utilities
|
|
- `save_publication_figure()`: Save in multiple formats with correct DPI
|
|
- `save_for_journal()`: Use journal-specific requirements automatically
|
|
- `check_figure_size()`: Verify dimensions meet journal specs
|
|
- Run directly: `python scripts/figure_export.py` for examples
|
|
|
|
- **`style_presets.py`**: Pre-configured styles
|
|
- `apply_publication_style()`: Apply preset styles (default, nature, science, cell)
|
|
- `set_color_palette()`: Quick palette switching
|
|
- `configure_for_journal()`: One-command journal configuration
|
|
- Run directly: `python scripts/style_presets.py` to see examples
|
|
|
|
### Assets Directory
|
|
|
|
**Use these files in figures:**
|
|
|
|
- **`color_palettes.py`**: Importable color definitions
|
|
- All recommended palettes as Python constants
|
|
- `apply_palette()` helper function
|
|
- Can be imported directly into notebooks/scripts
|
|
|
|
- **Matplotlib style files**: Use with `plt.style.use()`
|
|
- `publication.mplstyle`: General publication quality
|
|
- `nature.mplstyle`: Nature journal specifications
|
|
- `presentation.mplstyle`: Larger fonts for posters/slides
|
|
|
|
## Workflow Summary
|
|
|
|
**Recommended workflow for creating publication figures:**
|
|
|
|
1. **Plan**: Determine target journal, figure type, and content
|
|
2. **Configure**: Apply appropriate style for journal
|
|
```python
|
|
from style_presets import configure_for_journal
|
|
configure_for_journal('nature', 'single')
|
|
```
|
|
3. **Create**: Build figure with proper labels, colors, statistics
|
|
4. **Verify**: Check size, fonts, colors, accessibility
|
|
```python
|
|
from figure_export import check_figure_size
|
|
check_figure_size(fig, journal='nature')
|
|
```
|
|
5. **Export**: Save in required formats
|
|
```python
|
|
from figure_export import save_for_journal
|
|
save_for_journal(fig, 'figure1', 'nature', 'combination')
|
|
```
|
|
6. **Review**: View at final size in manuscript context
|
|
|
|
## Common Pitfalls to Avoid
|
|
|
|
1. **Font too small**: Text unreadable when printed at final size
|
|
2. **JPEG format**: Never use JPEG for graphs/plots (creates artifacts)
|
|
3. **Red-green colors**: ~8% of males cannot distinguish
|
|
4. **Low resolution**: Pixelated figures in publication
|
|
5. **Missing units**: Always label axes with units
|
|
6. **3D effects**: Distorts perception, avoid completely
|
|
7. **Chart junk**: Remove unnecessary gridlines, decorations
|
|
8. **Truncated axes**: Start bar charts at zero unless scientifically justified
|
|
9. **Inconsistent styling**: Different fonts/colors across figures in same manuscript
|
|
10. **No error bars**: Always show uncertainty
|
|
|
|
## Final Checklist
|
|
|
|
Before submitting figures, verify:
|
|
|
|
- [ ] Resolution meets journal requirements (300+ DPI)
|
|
- [ ] File format is correct (vector for plots, TIFF for images)
|
|
- [ ] Figure size matches journal specifications
|
|
- [ ] All text readable at final size (≥6 pt)
|
|
- [ ] Colors are colorblind-friendly
|
|
- [ ] Figure works in grayscale
|
|
- [ ] All axes labeled with units
|
|
- [ ] Error bars present with definition in caption
|
|
- [ ] Panel labels present and consistent
|
|
- [ ] No chart junk or 3D effects
|
|
- [ ] Fonts consistent across all figures
|
|
- [ ] Statistical significance clearly marked
|
|
- [ ] Legend is clear and complete
|
|
|
|
Use this skill to ensure scientific figures meet the highest publication standards while remaining accessible to all readers.
|