[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6M0G7Y4BRCVENWTCANNYZWD":3,"skill-same:01M6M0G7Y4BRCVENWTCANNYZWD":123},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":25,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":13,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":62,"install":63,"resources":76},"01M6M0G7Y4BRCVENWTCANNYZWD","scientific-visualization",null,"Meta-skill for publication-ready figures. Use when creating journal submission figures requiring multi-panel layouts, significance annotations, error bars, colorblind-safe palettes, and specific journal formatting (Nature, Science, Cell). Orchestrates matplotlib\u002Fseaborn\u002Fplotly with publication styles. For quick exploration use seaborn or plotly directly.","endman100\u002Fskill-router-nexus","endman100","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F31997019?v=4","01M6KPDX17BYDWW4RRB0TNGGMX","01M6KPDX64Y2QBEWVFG5W5PWPF",0,"MIT","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000013","分析与可视化","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"visualization","scientific visualization","scientific","Publication","safe","when","submission","for","quick","figures","error","panel","journal","formatting","meta-skill","exploration","ready","use","annotations","science","seaborn","plotly","Meta","2026-11-10 10:12:30",false,"---\nname: scientific-visualization\ndescription: Meta-skill for publication-ready figures. Use when creating journal submission figures requiring multi-panel layouts, significance annotations, error bars, colorblind-safe palettes, and specific journal formatting (Nature, Science, Cell). Orchestrates matplotlib\u002Fseaborn\u002Fplotly with publication styles. For quick exploration use seaborn or plotly directly.\nlicense: MIT license\nmetadata:\n    skill-author: K-Dense Inc.\n---\n\n# Scientific Visualization\n\n## Overview\n\nScientific visualization transforms data into clear, accurate figures for publication. Create journal-ready plots with multi-panel layouts, error bars, significance markers, and colorblind-safe palettes. Export as PDF\u002FEPS\u002FTIFF using matplotlib, seaborn, and plotly for manuscripts.\n\n## When to Use This Skill\n\nThis skill should be used when:\n- Creating plots or visualizations for scientific manuscripts\n- Preparing figures for journal submission (Nature, Science, Cell, PLOS, etc.)\n- Ensuring figures are colorblind-friendly and accessible\n- Making multi-panel figures with consistent styling\n- Exporting figures at correct resolution and format\n- Following specific publication guidelines\n- Improving existing figures to meet publication standards\n- Creating figures that need to work in both color and grayscale\n\n## Quick Start Guide\n\n### Basic Publication-Quality Figure\n\n```python\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n# Apply publication style (from scripts\u002Fstyle_presets.py)\nfrom style_presets import apply_publication_style\napply_publication_style('default')\n\n# Create figure with appropriate size (single column = 3.5 inches)\nfig, ax = plt.subplots(figsize=(3.5, 2.5))\n\n# Plot data\nx = np.linspace(0, 10, 100)\nax.plot(x, np.sin(x), label='sin(x)')\nax.plot(x, np.cos(x), label='cos(x)')\n\n# Proper labeling with units\nax.set_xlabel('Time (seconds)')\nax.set_ylabel('Amplitude (mV)')\nax.legend(frameon=False)\n\n# Remove unnecessary spines\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\n# Save in publication formats (from scripts\u002Ffigure_export.py)\nfrom figure_export import save_publication_figure\nsave_publication_figure(fig, 'figure1', formats=['pdf', 'png'], dpi=300)\n```\n\n### Using Pre-configured Styles\n\nApply journal-specific styles using the matplotlib style files in `assets\u002F`:\n\n```python\nimport matplotlib.pyplot as plt\n\n# Option 1: Use style file directly\nplt.style.use('assets\u002Fnature.mplstyle')\n\n# Option 2: Use style_presets.py helper\nfrom style_presets import configure_for_journal\nconfigure_for_journal('nature', figure_width='single')\n\n# Now create figures - they'll automatically match Nature specifications\nfig, ax = plt.subplots()\n# ... your plotting code ...\n```\n\n### Quick Start with Seaborn\n\nFor statistical plots, use seaborn with publication styling:\n\n```python\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom style_presets import apply_publication_style\n\n# Apply publication style\napply_publication_style('default')\nsns.set_theme(style='ticks', context='paper', font_scale=1.1)\nsns.set_palette('colorblind')\n\n# Create statistical comparison figure\nfig, ax = plt.subplots(figsize=(3.5, 3))\nsns.boxplot(data=df, x='treatment', y='response', \n            order=['Control', 'Low', 'High'], palette='Set2', ax=ax)\nsns.stripplot(data=df, x='treatment', y='response',\n              order=['Control', 'Low', 'High'], \n              color='black', alpha=0.3, size=3, ax=ax)\nax.set_ylabel('Response (μM)')\nsns.despine()\n\n# Save figure\nfrom figure_export import save_publication_figure\nsave_publication_figure(fig, 'treatment_comparison', formats=['pdf', 'png'], dpi=300)\n```\n\n## Core Principles and Best Practices\n\n### 1. Resolution and File Format\n\n**Critical requirements** (detailed in `references\u002Fpublication_guidelines.md`):\n- **Raster images** (photos, microscopy): 300-600 DPI\n- **Line art** (graphs, plots): 600-1200 DPI or vector format\n- **Vector formats** (preferred): PDF, EPS, SVG\n- **Raster formats**: TIFF, PNG (never JPEG for scientific data)\n\n**Implementation:**\n```python\n# Use the figure_export.py script for correct settings\nfrom figure_export import save_publication_figure\n\n# Saves in multiple formats with proper DPI\nsave_publication_figure(fig, 'myfigure', formats=['pdf', 'png'], dpi=300)\n\n# Or save for specific journal requirements\nfrom figure_export import save_for_journal\nsave_for_journal(fig, 'figure1', journal='nature', figure_type='combination')\n```\n\n### 2. Color Selection - Colorblind Accessibility\n\n**Always use colorblind-friendly palettes** (detailed in `references\u002Fcolor_palettes.md`):\n\n**Recommended: Okabe-Ito palette** (distinguishable by all types of color blindness):\n```python\n# Option 1: Use assets\u002Fcolor_palettes.py\nfrom color_palettes import OKABE_ITO_LIST, apply_palette\napply_palette('okabe_ito')\n\n# Option 2: Manual specification\nokabe_ito = ['#E69F00', '#56B4E9', '#009E73', '#F0E442',\n             '#0072B2', '#D55E00', '#CC79A7', '#000000']\nplt.rcParams['axes.prop_cycle'] = plt.cycler(color=okabe_ito)\n```\n\n**For heatmaps\u002Fcontinuous data:**\n- Use perceptually uniform colormaps: `viridis`, `plasma`, `cividis`\n- Avoid red-green diverging maps (use `PuOr`, `RdBu`, `BrBG` instead)\n- Never use `jet` or `rainbow` colormaps\n\n**Always test figures in grayscale** to ensure interpretability.\n\n### 3. Typography and Text\n\n**Font guidelines** (detailed in `references\u002Fpublication_guidelines.md`):\n- Sans-serif fonts: Arial, Helvetica, Calibri\n- Minimum sizes at **final print size**:\n  - Axis labels: 7-9 pt\n  - Tick labels: 6-8 pt\n  - Panel labels: 8-12 pt (bold)\n- Sentence case for labels: \"Time (hours)\" not \"TIME (HOURS)\"\n- Always include units in parentheses\n\n**Implementation:**\n```python\n# Set fonts globally\nimport matplotlib as mpl\nmpl.rcParams['font.family'] = 'sans-serif'\nmpl.rcParams['font.sans-serif'] = ['Arial', 'Helvetica']\nmpl.rcParams['font.size'] = 8\nmpl.rcParams['axes.labelsize'] = 9\nmpl.rcParams['xtick.labelsize'] = 7\nmpl.rcParams['ytick.labelsize'] = 7\n```\n\n### 4. Figure Dimensions\n\n**Journal-specific widths** (detailed in `references\u002Fjournal_requirements.md`):\n- **Nature**: Single 89 mm, Double 183 mm\n- **Science**: Single 55 mm, Double 175 mm\n- **Cell**: Single 85 mm, Double 178 mm\n\n**Check figure size compliance:**\n```python\nfrom figure_export import check_figure_size\n\nfig = plt.figure(figsize=(3.5, 3))  # 89 mm for Nature\ncheck_figure_size(fig, journal='nature')\n```\n\n### 5. Multi-Panel Figures\n\n**Best practices:**\n- Label panels with bold letters: **A**, **B**, **C** (uppercase for most journals, lowercase for Nature)\n- Maintain consistent styling across all panels\n- Align panels along edges where possible\n- Use adequate white space between panels\n\n**Example implementation** (see `references\u002Fmatplotlib_examples.md` for complete code):\n```python\nfrom string import ascii_uppercase\n\nfig = plt.figure(figsize=(7, 4))\ngs = fig.add_gridspec(2, 2, hspace=0.4, wspace=0.4)\n\nax1 = fig.add_subplot(gs[0, 0])\nax2 = fig.add_subplot(gs[0, 1])\n# ... create other panels ...\n\n# Add panel labels\nfor i, ax in enumerate([ax1, ax2, ...]):\n    ax.text(-0.15, 1.05, ascii_uppercase[i], transform=ax.transAxes,\n            fontsize=10, fontweight='bold', va='top')\n```\n\n## Common Tasks\n\n### Task 1: Create a Publication-Ready Line Plot\n\nSee `references\u002Fmatplotlib_examples.md` Example 1 for complete code.\n\n**Key steps:**\n1. Apply publication style\n2. Set appropriate figure size for target journal\n3. Use colorblind-friendly colors\n4. Add error bars with correct representation (SEM, SD, or CI)\n5. Label axes with units\n6. Remove unnecessary spines\n7. Save in vector format\n\n**Using seaborn for automatic confidence intervals:**\n```python\nimport seaborn as sns\nfig, ax = plt.subplots(figsize=(5, 3))\nsns.lineplot(data=timeseries, x='time', y='measurement',\n             hue='treatment', errorbar=('ci', 95), \n             markers=True, ax=ax)\nax.set_xlabel('Time (hours)')\nax.set_ylabel('Measurement (AU)')\nsns.despine()\n```\n\n### Task 2: Create a Multi-Panel Figure\n\nSee `references\u002Fmatplotlib_examples.md` Example 2 for complete code.\n\n**Key steps:**\n1. Use `GridSpec` for flexible layout\n2. Ensure consistent styling across panels\n3. Add bold panel labels (A, B, C, etc.)\n4. Align related panels\n5. Verify all text is readable at final size\n\n### Task 3: Create a Heatmap with Proper Colormap\n\nSee `references\u002Fmatplotlib_examples.md` Example 4 for complete code.\n\n**Key steps:**\n1. Use perceptually uniform colormap (`viridis`, `plasma`, `cividis`)\n2. Include labeled colorbar\n3. For diverging data, use colorblind-safe diverging map (`RdBu_r`, `PuOr`)\n4. Set appropriate center value for diverging maps\n5. Test appearance in grayscale\n\n**Using seaborn for correlation matrices:**\n```python\nimport seaborn as sns\nfig, ax = plt.subplots(figsize=(5, 4))\ncorr = df.corr()\nmask = np.triu(np.ones_like(corr, dtype=bool))\nsns.heatmap(corr, mask=mask, annot=True, fmt='.2f',\n            cmap='RdBu_r', center=0, square=True,\n            linewidths=1, cbar_kws={'shrink': 0.8}, ax=ax)\n```\n\n### Task 4: Prepare Figure for Specific Journal\n\n**Workflow:**\n1. Check journal requirements: `references\u002Fjournal_requirements.md`\n2. Configure matplotlib for journal:\n   ```python\n   from style_presets import configure_for_journal\n   configure_for_journal('nature', figure_width='single')\n   ```\n3. Create figure (will auto-size correctly)\n4. Export with journal specifications:\n   ```python\n   from figure_export import save_for_journal\n   save_for_journal(fig, 'figure1', journal='nature', figure_type='line_art')\n   ```\n\n### Task 5: Fix an Existing Figure to Meet Publication Standards\n\n**Checklist approach** (full checklist in `references\u002Fpublication_guidelines.md`):\n\n1. **Check resolution**: Verify DPI meets journal requirements\n2. **Check file format**: Use vector for plots, TIFF\u002FPNG for images\n3. **Check colors**: Ensure colorblind-friendly\n4. **Check fonts**: Minimum 6-7 pt at final size, sans-serif\n5. **Check labels**: All axes labeled with units\n6. **Check size**: Matches journal column width\n7. **Test grayscale**: Figure interpretable without color\n8. **Remove chart junk**: No unnecessary grids, 3D effects, shadows\n\n### Task 6: Create Colorblind-Friendly Visualizations\n\n**Strategy:**\n1. Use approved palettes from `assets\u002Fcolor_palettes.py`\n2. Add redundant encoding (line styles, markers, patterns)\n3. Test with colorblind simulator\n4. Ensure grayscale compatibility\n\n**Example:**\n```python\nfrom color_palettes import apply_palette\nimport matplotlib.pyplot as plt\n\napply_palette('okabe_ito')\n\n# Add redundant encoding beyond color\nline_styles = ['-', '--', '-.', ':']\nmarkers = ['o', 's', '^', 'v']\n\nfor i, (data, label) in enumerate(datasets):\n    plt.plot(x, data, linestyle=line_styles[i % 4],\n             marker=markers[i % 4], label=label)\n```\n\n## Statistical Rigor\n\n**Always include:**\n- Error bars (SD, SEM, or CI - specify which in caption)\n- Sample size (n) in figure or caption\n- Statistical significance markers (*, **, ***)\n- Individual data points when possible (not just summary statistics)\n\n**Example with statistics:**\n```python\n# Show individual points with summary statistics\nax.scatter(x_jittered, individual_points, alpha=0.4, s=8)\nax.errorbar(x, means, yerr=sems, fmt='o', capsize=3)\n\n# Mark significance\nax.text(1.5, max_y * 1.1, '***', ha='center', fontsize=8)\n```\n\n## Working with Different Plotting Libraries\n\n### Matplotlib\n- Most control over publication details\n- Best for complex multi-panel figures\n- Use provided style files for consistent formatting\n- See `references\u002Fmatplotlib_examples.md` for extensive examples\n\n### Seaborn\n\nSeaborn provides a high-level, dataset-oriented interface for statistical graphics, built on matplotlib. It excels at creating publication-quality statistical visualizations with minimal code while maintaining full compatibility with matplotlib customization.\n\n**Key advantages for scientific visualization:**\n- Automatic statistical estimation and confidence intervals\n- Built-in support for multi-panel figures (faceting)\n- Colorblind-friendly palettes by default\n- Dataset-oriented API using pandas DataFrames\n- Semantic mapping of variables to visual properties\n\n#### Quick Start with Publication Style\n\nAlways apply matplotlib publication styles first, then configure seaborn:\n\n```python\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom style_presets import apply_publication_style\n\n# Apply publication style\napply_publication_style('default')\n\n# Configure seaborn for publication\nsns.set_theme(style='ticks', context='paper', font_scale=1.1)\nsns.set_palette('colorblind')  # Use colorblind-safe palette\n\n# Create figure\nfig, ax = plt.subplots(figsize=(3.5, 2.5))\nsns.scatterplot(data=df, x='time', y='response', \n                hue='treatment', style='condition', ax=ax)\nsns.despine()  # Remove top and right spines\n```\n\n#### Common Plot Types for Publications\n\n**Statistical comparisons:**\n```python\n# Box plot with individual points for transparency\nfig, ax = plt.subplots(figsize=(3.5, 3))\nsns.boxplot(data=df, x='treatment', y='response', \n            order=['Control', 'Low', 'High'], palette='Set2', ax=ax)\nsns.stripplot(data=df, x='treatment', y='response',\n              order=['Control', 'Low', 'High'], \n              color='black', alpha=0.3, size=3, ax=ax)\nax.set_ylabel('Response (μM)')\nsns.despine()\n```\n\n**Distribution analysis:**\n```python\n# Violin plot with split comparison\nfig, ax = plt.subplots(figsize=(4, 3))\nsns.violinplot(data=df, x='timepoint', y='expression',\n               hue='treatment', split=True, inner='quartile', ax=ax)\nax.set_ylabel('Gene Expression (AU)')\nsns.despine()\n```\n\n**Correlation matrices:**\n```python\n# Heatmap with proper colormap and annotations\nfig, ax = plt.subplots(figsize=(5, 4))\ncorr = df.corr()\nmask = np.triu(np.ones_like(corr, dtype=bool))  # Show only lower triangle\nsns.heatmap(corr, mask=mask, annot=True, fmt='.2f',\n            cmap='RdBu_r', center=0, square=True,\n            linewidths=1, cbar_kws={'shrink': 0.8}, ax=ax)\nplt.tight_layout()\n```\n\n**Time series with confidence bands:**\n```python\n# Line plot with automatic CI calculation\nfig, ax = plt.subplots(figsize=(5, 3))\nsns.lineplot(data=timeseries, x='time', y='measurement',\n             hue='treatment', style='replicate',\n             errorbar=('ci', 95), markers=True, dashes=False, ax=ax)\nax.set_xlabel('Time (hours)')\nax.set_ylabel('Measurement (AU)')\nsns.despine()\n```\n\n#### Multi-Panel Figures with Seaborn\n\n**Using FacetGrid for automatic faceting:**\n```python\n# Create faceted plot\ng = sns.relplot(data=df, x='dose', y='response',\n                hue='treatment', col='cell_line', row='timepoint',\n                kind='line', height=2.5, aspect=1.2,\n                errorbar=('ci', 95), markers=True)\ng.set_axis_labels('Dose (μM)', 'Response (AU)')\ng.set_titles('{row_name} | {col_name}')\nsns.despine()\n\n# Save with correct DPI\nfrom figure_export import save_publication_figure\nsave_publication_figure(g.figure, 'figure_facets', \n                       formats=['pdf', 'png'], dpi=300)\n```\n\n**Combining seaborn with matplotlib subplots:**\n```python\n# Create custom multi-panel layout\nfig, axes = plt.subplots(2, 2, figsize=(7, 6))\n\n# Panel A: Scatter with regression\nsns.regplot(data=df, x='predictor', y='response', ax=axes[0, 0])\naxes[0, 0].text(-0.15, 1.05, 'A', transform=axes[0, 0].transAxes,\n                fontsize=10, fontweight='bold')\n\n# Panel B: Distribution comparison\nsns.violinplot(data=df, x='group', y='value', ax=axes[0, 1])\naxes[0, 1].text(-0.15, 1.05, 'B', transform=axes[0, 1].transAxes,\n                fontsize=10, fontweight='bold')\n\n# Panel C: Heatmap\nsns.heatmap(correlation_data, cmap='viridis', ax=axes[1, 0])\naxes[1, 0].text(-0.15, 1.05, 'C', transform=axes[1, 0].transAxes,\n                fontsize=10, fontweight='bold')\n\n# Panel D: Time series\nsns.lineplot(data=timeseries, x='time', y='signal', \n             hue='condition', ax=axes[1, 1])\naxes[1, 1].text(-0.15, 1.05, 'D', transform=axes[1, 1].transAxes,\n                fontsize=10, fontweight='bold')\n\nplt.tight_layout()\nsns.despine()\n```\n\n#### Color Palettes for Publications\n\nSeaborn includes several colorblind-safe palettes:\n\n```python\n# Use built-in colorblind palette (recommended)\nsns.set_palette('colorblind')\n\n# Or specify custom colorblind-safe colors (Okabe-Ito)\nokabe_ito = ['#E69F00', '#56B4E9', '#009E73', '#F0E442',\n             '#0072B2', '#D55E00', '#CC79A7', '#000000']\nsns.set_palette(okabe_ito)\n\n# For heatmaps and continuous data\nsns.heatmap(data, cmap='viridis')  # Perceptually uniform\nsns.heatmap(corr, cmap='RdBu_r', center=0)  # Diverging, centered\n```\n\n#### Choosing Between Axes-Level and Figure-Level Functions\n\n**Axes-level functions** (e.g., `scatterplot`, `boxplot`, `heatmap`):\n- Use when building custom multi-panel layouts\n- Accept `ax=` parameter for precise placement\n- Better integration with matplotlib subplots\n- More control over figure composition\n\n```python\nfig, ax = plt.subplots(figsize=(3.5, 2.5))\nsns.scatterplot(data=df, x='x', y='y', hue='group', ax=ax)\n```\n\n**Figure-level functions** (e.g., `relplot`, `catplot`, `displot`):\n- Use for automatic faceting by categorical variables\n- Create complete figures with consistent styling\n- Great for exploratory analysis\n- Use `height` and `aspect` for sizing\n\n```python\ng = sns.relplot(data=df, x='x', y='y', col='category', kind='scatter')\n```\n\n#### Statistical Rigor with Seaborn\n\nSeaborn automatically computes and displays uncertainty:\n\n```python\n# Line plot: shows mean ± 95% CI by default\nsns.lineplot(data=df, x='time', y='value', hue='treatment',\n             errorbar=('ci', 95))  # Can change to 'sd', 'se', etc.\n\n# Bar plot: shows mean with bootstrapped CI\nsns.barplot(data=df, x='treatment', y='response',\n            errorbar=('ci', 95), capsize=0.1)\n\n# Always specify error type in figure caption:\n# \"Error bars represent 95% confidence intervals\"\n```\n\n#### Best Practices for Publication-Ready Seaborn Figures\n\n1. **Always set publication theme first:**\n   ```python\n   sns.set_theme(style='ticks', context='paper', font_scale=1.1)\n   ```\n\n2. **Use colorblind-safe palettes:**\n   ```python\n   sns.set_palette('colorblind')\n   ```\n\n3. **Remove unnecessary elements:**\n   ```python\n   sns.despine()  # Remove top and right spines\n   ```\n\n4. **Control figure size appropriately:**\n   ```python\n   # Axes-level: use matplotlib figsize\n   fig, ax = plt.subplots(figsize=(3.5, 2.5))\n   \n   # Figure-level: use height and aspect\n   g = sns.relplot(..., height=3, aspect=1.2)\n   ```\n\n5. **Show individual data points when possible:**\n   ```python\n   sns.boxplot(...)  # Summary statistics\n   sns.stripplot(..., alpha=0.3)  # Individual points\n   ```\n\n6. **Include proper labels with units:**\n   ```python\n   ax.set_xlabel('Time (hours)')\n   ax.set_ylabel('Expression (AU)')\n   ```\n\n7. **Export at correct resolution:**\n   ```python\n   from figure_export import save_publication_figure\n   save_publication_figure(fig, 'figure_name', \n                          formats=['pdf', 'png'], dpi=300)\n   ```\n\n#### Advanced Seaborn Techniques\n\n**Pairwise relationships for exploratory analysis:**\n```python\n# Quick overview of all relationships\ng = sns.pairplot(data=df, hue='condition', \n                 vars=['gene1', 'gene2', 'gene3'],\n                 corner=True, diag_kind='kde', height=2)\n```\n\n**Hierarchical clustering heatmap:**\n```python\n# Cluster samples and features\ng = sns.clustermap(expression_data, method='ward', \n                   metric='euclidean', z_score=0,\n                   cmap='RdBu_r', center=0, \n                   figsize=(10, 8), \n                   row_colors=condition_colors,\n                   cbar_kws={'label': 'Z-score'})\n```\n\n**Joint distributions with marginals:**\n```python\n# Bivariate distribution with context\ng = sns.jointplot(data=df, x='gene1', y='gene2',\n                  hue='treatment', kind='scatter',\n                  height=6, ratio=4, marginal_kws={'kde': True})\n```\n\n#### Common Seaborn Issues and Solutions\n\n**Issue: Legend outside plot area**\n```python\ng = sns.relplot(...)\ng._legend.set_bbox_to_anchor((0.9, 0.5))\n```\n\n**Issue: Overlapping labels**\n```python\nplt.xticks(rotation=45, ha='right')\nplt.tight_layout()\n```\n\n**Issue: Text too small at final size**\n```python\nsns.set_context('paper', font_scale=1.2)  # Increase if needed\n```\n\n#### Additional Resources\n\nFor more detailed seaborn information, see:\n- `scientific-skills\u002Fseaborn\u002FSKILL.md` - Comprehensive seaborn documentation\n- `scientific-skills\u002Fseaborn\u002Freferences\u002Fexamples.md` - Practical use cases\n- `scientific-skills\u002Fseaborn\u002Freferences\u002Ffunction_reference.md` - Complete API reference\n- `scientific-skills\u002Fseaborn\u002Freferences\u002Fobjects_interface.md` - Modern declarative API\n\n### Plotly\n- Interactive figures for exploration\n- Export static images for publication\n- Configure for publication quality:\n```python\nfig.update_layout(\n    font=dict(family='Arial, sans-serif', size=10),\n    plot_bgcolor='white',\n    # ... see matplotlib_examples.md Example 8\n)\nfig.write_image('figure.png', scale=3)  # scale=3 gives ~300 DPI\n```\n\n## Resources\n\n### References Directory\n\n**Load these as needed for detailed information:**\n\n- **`publication_guidelines.md`**: Comprehensive best practices\n  - Resolution and file format requirements\n  - Typography guidelines\n  - Layout and composition rules\n  - Statistical rigor requirements\n  - Complete publication checklist\n\n- **`color_palettes.md`**: Color usage guide\n  - Colorblind-friendly palette specifications with RGB values\n  - Sequential and diverging colormap recommendations\n  - Testing procedures for accessibility\n  - Domain-specific palettes (genomics, microscopy)\n\n- **`journal_requirements.md`**: Journal-specific specifications\n  - Technical requirements by publisher\n  - File format and DPI specifications\n  - Figure dimension requirements\n  - Quick reference table\n\n- **`matplotlib_examples.md`**: Practical code examples\n  - 10 complete working examples\n  - Line plots, bar plots, heatmaps, multi-panel figures\n  - Journal-specific figure examples\n  - Tips for each library (matplotlib, seaborn, plotly)\n\n### Scripts Directory\n\n**Use these helper scripts for automation:**\n\n- **`figure_export.py`**: Export utilities\n  - `save_publication_figure()`: Save in multiple formats with correct DPI\n  - `save_for_journal()`: Use journal-specific requirements automatically\n  - `check_figure_size()`: Verify dimensions meet journal specs\n  - Run directly: `python scripts\u002Ffigure_export.py` for examples\n\n- **`style_presets.py`**: Pre-configured styles\n  - `apply_publication_style()`: Apply preset styles (default, nature, science, cell)\n  - `set_color_palette()`: Quick palette switching\n  - `configure_for_journal()`: One-command journal configuration\n  - Run directly: `python scripts\u002Fstyle_presets.py` to see examples\n\n### Assets Directory\n\n**Use these files in figures:**\n\n- **`color_palettes.py`**: Importable color definitions\n  - All recommended palettes as Python constants\n  - `apply_palette()` helper function\n  - Can be imported directly into notebooks\u002Fscripts\n\n- **Matplotlib style files**: Use with `plt.style.use()`\n  - `publication.mplstyle`: General publication quality\n  - `nature.mplstyle`: Nature journal specifications\n  - `presentation.mplstyle`: Larger fonts for posters\u002Fslides\n\n## Workflow Summary\n\n**Recommended workflow for creating publication figures:**\n\n1. **Plan**: Determine target journal, figure type, and content\n2. **Configure**: Apply appropriate style for journal\n   ```python\n   from style_presets import configure_for_journal\n   configure_for_journal('nature', 'single')\n   ```\n3. **Create**: Build figure with proper labels, colors, statistics\n4. **Verify**: Check size, fonts, colors, accessibility\n   ```python\n   from figure_export import check_figure_size\n   check_figure_size(fig, journal='nature')\n   ```\n5. **Export**: Save in required formats\n   ```python\n   from figure_export import save_for_journal\n   save_for_journal(fig, 'figure1', 'nature', 'combination')\n   ```\n6. **Review**: View at final size in manuscript context\n\n## Common Pitfalls to Avoid\n\n1. **Font too small**: Text unreadable when printed at final size\n2. **JPEG format**: Never use JPEG for graphs\u002Fplots (creates artifacts)\n3. **Red-green colors**: ~8% of males cannot distinguish\n4. **Low resolution**: Pixelated figures in publication\n5. **Missing units**: Always label axes with units\n6. **3D effects**: Distorts perception, avoid completely\n7. **Chart junk**: Remove unnecessary gridlines, decorations\n8. **Truncated axes**: Start bar charts at zero unless scientifically justified\n9. **Inconsistent styling**: Different fonts\u002Fcolors across figures in same manuscript\n10. **No error bars**: Always show uncertainty\n\n## Final Checklist\n\nBefore submitting figures, verify:\n\n- [ ] Resolution meets journal requirements (300+ DPI)\n- [ ] File format is correct (vector for plots, TIFF for images)\n- [ ] Figure size matches journal specifications\n- [ ] All text readable at final size (≥6 pt)\n- [ ] Colors are colorblind-friendly\n- [ ] Figure works in grayscale\n- [ ] All axes labeled with units\n- [ ] Error bars present with definition in caption\n- [ ] Panel labels present and consistent\n- [ ] No chart junk or 3D effects\n- [ ] Fonts consistent across all figures\n- [ ] Statistical significance clearly marked\n- [ ] Legend is clear and complete\n\nUse this skill to ensure scientific figures meet the highest publication standards while remaining accessible to all readers.\n\n","# Scientific Visualization\n\n## Overview\n\nScientific visualization transforms data into clear, accurate figures for publication. Create journal-ready plots with multi-panel layouts, error bars, significance markers, and colorblind-safe palettes. Export as PDF\u002FEPS\u002FTIFF using matplotlib, seaborn, and plotly for manuscripts.\n\n## When to Use This Skill\n\nThis skill should be used when:\n- Creating plots or visualizations for scientific manuscripts\n- Preparing figures for journal submission (Nature, Science, Cell, PLOS, etc.)\n- Ensuring figures are colorblind-friendly and accessible\n- Making multi-panel figures with consistent styling\n- Exporting figures at correct resolution and format\n- Following specific publication guidelines\n- Improving existing figures to meet publication standards\n- Creating figures that need to work in both color and grayscale\n\n## Quick Start Guide\n\n### Basic Publication-Quality Figure\n\n```python\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n# Apply publication style (from scripts\u002Fstyle_presets.py)\nfrom style_presets import apply_publication_style\napply_publication_style('default')\n\n# Create figure with appropriate size (single column = 3.5 inches)\nfig, ax = plt.subplots(figsize=(3.5, 2.5))\n\n# Plot data\nx = np.linspace(0, 10, 100)\nax.plot(x, np.sin(x), label='sin(x)')\nax.plot(x, np.cos(x), label='cos(x)')\n\n# Proper labeling with units\nax.set_xlabel('Time (seconds)')\nax.set_ylabel('Amplitude (mV)')\nax.legend(frameon=False)\n\n# Remove unnecessary spines\nax.spines['top'].set_visible(False)\nax.spines['right'].set_visible(False)\n\n# Save in publication formats (from scripts\u002Ffigure_export.py)\nfrom figure_export import save_publication_figure\nsave_publication_figure(fig, 'figure1', formats=['pdf', 'png'], dpi=300)\n```\n\n### Using Pre-configured Styles\n\nApply journal-specific styles using the matplotlib style files in `assets\u002F`:\n\n```python\nimport matplotlib.pyplot as plt\n\n# Option 1: Use style file directly\nplt.style.use('assets\u002Fnature.mplstyle')\n\n# Option 2: Use style_presets.py helper\nfrom style_presets import configure_for_journal\nconfigure_for_journal('nature', figure_width='single')\n\n# Now create figures - they'll automatically match Nature specifications\nfig, ax = plt.subplots()\n# ... your plotting code ...\n```\n\n### Quick Start with Seaborn\n\nFor statistical plots, use seaborn with publication styling:\n\n```python\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom style_presets import apply_publication_style\n\n# Apply publication style\napply_publication_style('default')\nsns.set_theme(style='ticks', context='paper', font_scale=1.1)\nsns.set_palette('colorblind')\n\n# Create statistical comparison figure\nfig, ax = plt.subplots(figsize=(3.5, 3))\nsns.boxplot(data=df, x='treatment', y='response', \n            order=['Control', 'Low', 'High'], palette='Set2', ax=ax)\nsns.stripplot(data=df, x='treatment', y='response',\n              order=['Control', 'Low', 'High'], \n              color='black', alpha=0.3, size=3, ax=ax)\nax.set_ylabel('Response (μM)')\nsns.despine()\n\n# Save figure\nfrom figure_export import save_publication_figure\nsave_publication_figure(fig, 'treatment_comparison', formats=['pdf', 'png'], dpi=300)\n```\n\n## Core Principles and Best Practices\n\n### 1. Resolution and File Format\n\n**Critical requirements** (detailed in `references\u002Fpublication_guidelines.md`):\n- **Raster images** (photos, microscopy): 300-600 DPI\n- **Line art** (graphs, plots): 600-1200 DPI or vector format\n- **Vector formats** (preferred): PDF, EPS, SVG\n- **Raster formats**: TIFF, PNG (never JPEG for scientific data)\n\n**Implementation:**\n```python\n# Use the figure_export.py script for correct settings\nfrom figure_export import save_publication_figure\n\n# Saves in multiple formats with proper DPI\nsave_publication_figure(fig, 'myfigure', formats=['pdf', 'png'], dpi=300)\n\n# Or save for specific journal requirements\nfrom figure_export import save_for_journal\nsave_for_journal(fig, 'figure1', journal='nature', figure_type='combination')\n```\n\n### 2. Color Selection - Colorblind Accessibility\n\n**Always use colorblind-friendly palettes** (detailed in `references\u002Fcolor_palettes.md`):\n\n**Recommended: Okabe-Ito palette** (distinguishable by all types of color blindness):\n```python\n# Option 1: Use assets\u002Fcolor_palettes.py\nfrom color_palettes import OKABE_ITO_LIST, apply_palette\napply_palette('okabe_ito')\n\n# Option 2: Manual specification\nokabe_ito = ['#E69F00', '#56B4E9', '#009E73', '#F0E442',\n             '#0072B2', '#D55E00', '#CC79A7', '#000000']\nplt.rcParams['axes.prop_cycle'] = plt.cycler(color=okabe_ito)\n```\n\n**For heatmaps\u002Fcontinuous data:**\n- Use perceptually uniform colormaps: `viridis`, `plasma`, `cividis`\n- Avoid red-green diverging maps (use `PuOr`, `RdBu`, `BrBG` instead)\n- Never use `jet` or `rainbow` colormaps\n\n**Always test figures in grayscale** to ensure interpretability.\n\n### 3. Typography and Text\n\n**Font guidelines** (detailed in `references\u002Fpublication_guidelines.md`):\n- Sans-serif fonts: Arial, Helvetica, Calibri\n- Minimum sizes at **final print size**:\n  - Axis labels: 7-9 pt\n  - Tick labels: 6-8 pt\n  - Panel labels: 8-12 pt (bold)\n- Sentence case for labels: \"Time (hours)\" not \"TIME (HOURS)\"\n- Always include units in parentheses\n\n**Implementation:**\n```python\n# Set fonts globally\nimport matplotlib as mpl\nmpl.rcParams['font.family'] = 'sans-serif'\nmpl.rcParams['font.sans-serif'] = ['Arial', 'Helvetica']\nmpl.rcParams['font.size'] = 8\nmpl.rcParams['axes.labelsize'] = 9\nmpl.rcParams['xtick.labelsize'] = 7\nmpl.rcParams['ytick.labelsize'] = 7\n```\n\n### 4. Figure Dimensions\n\n**Journal-specific widths** (detailed in `references\u002Fjournal_requirements.md`):\n- **Nature**: Single 89 mm, Double 183 mm\n- **Science**: Single 55 mm, Double 175 mm\n- **Cell**: Single 85 mm, Double 178 mm\n\n**Check figure size compliance:**\n```python\nfrom figure_export import check_figure_size\n\nfig = plt.figure(figsize=(3.5, 3))  # 89 mm for Nature\ncheck_figure_size(fig, journal='nature')\n```\n\n### 5. Multi-Panel Figures\n\n**Best practices:**\n- Label panels with bold letters: **A**, **B**, **C** (uppercase for most journals, lowercase for Nature)\n- Maintain consistent styling across all panels\n- Align panels along edges where possible\n- Use adequate white space between panels\n\n**Example implementation** (see `references\u002Fmatplotlib_examples.md` for complete code):\n```python\nfrom string import ascii_uppercase\n\nfig = plt.figure(figsize=(7, 4))\ngs = fig.add_gridspec(2, 2, hspace=0.4, wspace=0.4)\n\nax1 = fig.add_subplot(gs[0, 0])\nax2 = fig.add_subplot(gs[0, 1])\n# ... create other panels ...\n\n# Add panel labels\nfor i, ax in enumerate([ax1, ax2, ...]):\n    ax.text(-0.15, 1.05, ascii_uppercase[i], transform=ax.transAxes,\n            fontsize=10, fontweight='bold', va='top')\n```\n\n## Common Tasks\n\n### Task 1: Create a Publication-Ready Line Plot\n\nSee `references\u002Fmatplotlib_examples.md` Example 1 for complete code.\n\n**Key steps:**\n1. Apply publication style\n2. Set appropriate figure size for target journal\n3. Use colorblind-friendly colors\n4. Add error bars with correct representation (SEM, SD, or CI)\n5. Label axes with units\n6. Remove unnecessary spines\n7. Save in vector format\n\n**Using seaborn for automatic confidence intervals:**\n```python\nimport seaborn as sns\nfig, ax = plt.subplots(figsize=(5, 3))\nsns.lineplot(data=timeseries, x='time', y='measurement',\n             hue='treatment', errorbar=('ci', 95), \n             markers=True, ax=ax)\nax.set_xlabel('Time (hours)')\nax.set_ylabel('Measurement (AU)')\nsns.despine()\n```\n\n### Task 2: Create a Multi-Panel Figure\n\nSee `references\u002Fmatplotlib_examples.md` Example 2 for complete code.\n\n**Key steps:**\n1. Use `GridSpec` for flexible layout\n2. Ensure consistent styling across panels\n3. Add bold panel labels (A, B, C, etc.)\n4. Align related panels\n5. Verify all text is readable at final size\n\n### Task 3: Create a Heatmap with Proper Colormap\n\nSee `references\u002Fmatplotlib_examples.md` Example 4 for complete code.\n\n**Key steps:**\n1. Use perceptually uniform colormap (`viridis`, `plasma`, `cividis`)\n2. Include labeled colorbar\n3. For diverging data, use colorblind-safe diverging map (`RdBu_r`, `PuOr`)\n4. Set appropriate center value for diverging maps\n5. Test appearance in grayscale\n\n**Using seaborn for correlation matrices:**\n```python\nimport seaborn as sns\nfig, ax = plt.subplots(figsize=(5, 4))\ncorr = df.corr()\nmask = np.triu(np.ones_like(corr, dtype=bool))\nsns.heatmap(corr, mask=mask, annot=True, fmt='.2f',\n            cmap='RdBu_r', center=0, square=True,\n            linewidths=1, cbar_kws={'shrink': 0.8}, ax=ax)\n```\n\n### Task 4: Prepare Figure for Specific Journal\n\n**Workflow:**\n1. Check journal requirements: `references\u002Fjournal_requirements.md`\n2. Configure matplotlib for journal:\n   ```python\n   from style_presets import configure_for_journal\n   configure_for_journal('nature', figure_width='single')\n   ```\n3. Create figure (will auto-size correctly)\n4. Export with journal specifications:\n   ```python\n   from figure_export import save_for_journal\n   save_for_journal(fig, 'figure1', journal='nature', figure_type='line_art')\n   ```\n\n### Task 5: Fix an Existing Figure to Meet Publication Standards\n\n**Checklist approach** (full checklist in `references\u002Fpublication_guidelines.md`):\n\n1. **Check resolution**: Verify DPI meets journal requirements\n2. **Check file format**: Use vector for plots, TIFF\u002FPNG for images\n3. **Check colors**: Ensure colorblind-friendly\n4. **Check fonts**: Minimum 6-7 pt at final size, sans-serif\n5. **Check labels**: All axes labeled with units\n6. **Check size**: Matches journal column width\n7. **Test grayscale**: Figure interpretable without color\n8. **Remove chart junk**: No unnecessary grids, 3D effects, shadows\n\n### Task 6: Create Colorblind-Friendly Visualizations\n\n**Strategy:**\n1. Use approved palettes from `assets\u002Fcolor_palettes.py`\n2. Add redundant encoding (line styles, markers, patterns)\n3. Test with colorblind simulator\n4. Ensure grayscale compatibility\n\n**Example:**\n```python\nfrom color_palettes import apply_palette\nimport matplotlib.pyplot as plt\n\napply_palette('okabe_ito')\n\n# Add redundant encoding beyond color\nline_styles = ['-', '--', '-.', ':']\nmarkers = ['o', 's', '^', 'v']\n\nfor i, (data, label) in enumerate(datasets):\n    plt.plot(x, data, linestyle=line_styles[i % 4],\n             marker=markers[i % 4], label=label)\n```\n\n## Statistical Rigor\n\n**Always include:**\n- Error bars (SD, SEM, or CI - specify which in caption)\n- Sample size (n) in figure or caption\n- Statistical significance markers (*, **, ***)\n- Individual data points when possible (not just summary statistics)\n\n**Example with statistics:**\n```python\n# Show individual points with summary statistics\nax.scatter(x_jittered, individual_points, alpha=0.4, s=8)\nax.errorbar(x, means, yerr=sems, fmt='o', capsize=3)\n\n# Mark significance\nax.text(1.5, max_y * 1.1, '***', ha='center', fontsize=8)\n```\n\n## Working with Different Plotting Libraries\n\n### Matplotlib\n- Most control over publication details\n- Best for complex multi-panel figures\n- Use provided style files for consistent formatting\n- See `references\u002Fmatplotlib_examples.md` for extensive examples\n\n### Seaborn\n\nSeaborn provides a high-level, dataset-oriented interface for statistical graphics, built on matplotlib. It excels at creating publication-quality statistical visualizations with minimal code while maintaining full compatibility with matplotlib customization.\n\n**Key advantages for scientific visualization:**\n- Automatic statistical estimation and confidence intervals\n- Built-in support for multi-panel figures (faceting)\n- Colorblind-friendly palettes by default\n- Dataset-oriented API using pandas DataFrames\n- Semantic mapping of variables to visual properties\n\n#### Quick Start with Publication Style\n\nAlways apply matplotlib publication styles first, then configure seaborn:\n\n```python\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom style_presets import apply_publication_style\n\n# Apply publication style\napply_publication_style('default')\n\n# Configure seaborn for publication\nsns.set_theme(style='ticks', context='paper', font_scale=1.1)\nsns.set_palette('colorblind')  # Use colorblind-safe palette\n\n# Create figure\nfig, ax = plt.subplots(figsize=(3.5, 2.5))\nsns.scatterplot(data=df, x='time', y='response', \n                hue='treatment', style='condition', ax=ax)\nsns.despine()  # Remove top and right spines\n```\n\n#### Common Plot Types for Publications\n\n**Statistical comparisons:**\n```python\n# Box plot with individual points for transparency\nfig, ax = plt.subplots(figsize=(3.5, 3))\nsns.boxplot(data=df, x='treatment', y='response', \n            order=['Control', 'Low', 'High'], palette='Set2', ax=ax)\nsns.stripplot(data=df, x='treatment', y='response',\n              order=['Control', 'Low', 'High'], \n              color='black', alpha=0.3, size=3, ax=ax)\nax.set_ylabel('Response (μM)')\nsns.despine()\n```\n\n**Distribution analysis:**\n```python\n# Violin plot with split comparison\nfig, ax = plt.subplots(figsize=(4, 3))\nsns.violinplot(data=df, x='timepoint', y='expression',\n               hue='treatment', split=True, inner='quartile', ax=ax)\nax.set_ylabel('Gene Expression (AU)')\nsns.despine()\n```\n\n**Correlation matrices:**\n```python\n# Heatmap with proper colormap and annotations\nfig, ax = plt.subplots(figsize=(5, 4))\ncorr = df.corr()\nmask = np.triu(np.ones_like(corr, dtype=bool))  # Show only lower triangle\nsns.heatmap(corr, mask=mask, annot=True, fmt='.2f',\n            cmap='RdBu_r', center=0, square=True,\n            linewidths=1, cbar_kws={'shrink': 0.8}, ax=ax)\nplt.tight_layout()\n```\n\n**Time series with confidence bands:**\n```python\n# Line plot with automatic CI calculation\nfig, ax = plt.subplots(figsize=(5, 3))\nsns.lineplot(data=timeseries, x='time', y='measurement',\n             hue='treatment', style='replicate',\n             errorbar=('ci', 95), markers=True, dashes=False, ax=ax)\nax.set_xlabel('Time (hours)')\nax.set_ylabel('Measurement (AU)')\nsns.despine()\n```\n\n#### Multi-Panel Figures with Seaborn\n\n**Using FacetGrid for automatic faceting:**\n```python\n# Create faceted plot\ng = sns.relplot(data=df, x='dose', y='response',\n                hue='treatment', col='cell_line', row='timepoint',\n                kind='line', height=2.5, aspect=1.2,\n                errorbar=('ci', 95), markers=True)\ng.set_axis_labels('Dose (μM)', 'Response (AU)')\ng.set_titles('{row_name} | {col_name}')\nsns.despine()\n\n# Save with correct DPI\nfrom figure_export import save_publication_figure\nsave_publication_figure(g.figure, 'figure_facets', \n                       formats=['pdf', 'png'], dpi=300)\n```\n\n**Combining seaborn with matplotlib subplots:**\n```python\n# Create custom multi-panel layout\nfig, axes = plt.subplots(2, 2, figsize=(7, 6))\n\n# Panel A: Scatter with regression\nsns.regplot(data=df, x='predictor', y='response', ax=axes[0, 0])\naxes[0, 0].text(-0.15, 1.05, 'A', transform=axes[0, 0].transAxes,\n                fontsize=10, fontweight='bold')\n\n# Panel B: Distribution comparison\nsns.violinplot(data=df, x='group', y='value', ax=axes[0, 1])\naxes[0, 1].text(-0.15, 1.05, 'B', transform=axes[0, 1].transAxes,\n                fontsize=10, fontweight='bold')\n\n# Panel C: Heatmap\nsns.heatmap(correlation_data, cmap='viridis', ax=axes[1, 0])\naxes[1, 0].text(-0.15, 1.05, 'C', transform=axes[1, 0].transAxes,\n                fontsize=10, fontweight='bold')\n\n# Panel D: Time series\nsns.lineplot(data=timeseries, x='time', y='signal', \n             hue='condition', ax=axes[1, 1])\naxes[1, 1].text(-0.15, 1.05, 'D', transform=axes[1, 1].transAxes,\n                fontsize=10, fontweight='bold')\n\nplt.tight_layout()\nsns.despine()\n```\n\n#### Color Palettes for Publications\n\nSeaborn includes several colorblind-safe palettes:\n\n```python\n# Use built-in colorblind palette (recommended)\nsns.set_palette('colorblind')\n\n# Or specify custom colorblind-safe colors (Okabe-Ito)\nokabe_ito = ['#E69F00', '#56B4E9', '#009E73', '#F0E442',\n             '#0072B2', '#D55E00', '#CC79A7', '#000000']\nsns.set_palette(okabe_ito)\n\n# For heatmaps and continuous data\nsns.heatmap(data, cmap='viridis')  # Perceptually uniform\nsns.heatmap(corr, cmap='RdBu_r', center=0)  # Diverging, centered\n```\n\n#### Choosing Between Axes-Level and Figure-Level Functions\n\n**Axes-level functions** (e.g., `scatterplot`, `boxplot`, `heatmap`):\n- Use when building custom multi-panel layouts\n- Accept `ax=` parameter for precise placement\n- Better integration with matplotlib subplots\n- More control over figure composition\n\n```python\nfig, ax = plt.subplots(figsize=(3.5, 2.5))\nsns.scatterplot(data=df, x='x', y='y', hue='group', ax=ax)\n```\n\n**Figure-level functions** (e.g., `relplot`, `catplot`, `displot`):\n- Use for automatic faceting by categorical variables\n- Create complete figures with consistent styling\n- Great for exploratory analysis\n- Use `height` and `aspect` for sizing\n\n```python\ng = sns.relplot(data=df, x='x', y='y', col='category', kind='scatter')\n```\n\n#### Statistical Rigor with Seaborn\n\nSeaborn automatically computes and displays uncertainty:\n\n```python\n# Line plot: shows mean ± 95% CI by default\nsns.lineplot(data=df, x='time', y='value', hue='treatment',\n             errorbar=('ci', 95))  # Can change to 'sd', 'se', etc.\n\n# Bar plot: shows mean with bootstrapped CI\nsns.barplot(data=df, x='treatment', y='response',\n            errorbar=('ci', 95), capsize=0.1)\n\n# Always specify error type in figure caption:\n# \"Error bars represent 95% confidence intervals\"\n```\n\n#### Best Practices for Publication-Ready Seaborn Figures\n\n1. **Always set publication theme first:**\n   ```python\n   sns.set_theme(style='ticks', context='paper', font_scale=1.1)\n   ```\n\n2. **Use colorblind-safe palettes:**\n   ```python\n   sns.set_palette('colorblind')\n   ```\n\n3. **Remove unnecessary elements:**\n   ```python\n   sns.despine()  # Remove top and right spines\n   ```\n\n4. **Control figure size appropriately:**\n   ```python\n   # Axes-level: use matplotlib figsize\n   fig, ax = plt.subplots(figsize=(3.5, 2.5))\n   \n   # Figure-level: use height and aspect\n   g = sns.relplot(..., height=3, aspect=1.2)\n   ```\n\n5. **Show individual data points when possible:**\n   ```python\n   sns.boxplot(...)  # Summary statistics\n   sns.stripplot(..., alpha=0.3)  # Individual points\n   ```\n\n6. **Include proper labels with units:**\n   ```python\n   ax.set_xlabel('Time (hours)')\n   ax.set_ylabel('Expression (AU)')\n   ```\n\n7. **Export at correct resolution:**\n   ```python\n   from figure_export import save_publication_figure\n   save_publication_figure(fig, 'figure_name', \n                          formats=['pdf', 'png'], dpi=300)\n   ```\n\n#### Advanced Seaborn Techniques\n\n**Pairwise relationships for exploratory analysis:**\n```python\n# Quick overview of all relationships\ng = sns.pairplot(data=df, hue='condition', \n                 vars=['gene1', 'gene2', 'gene3'],\n                 corner=True, diag_kind='kde', height=2)\n```\n\n**Hierarchical clustering heatmap:**\n```python\n# Cluster samples and features\ng = sns.clustermap(expression_data, method='ward', \n                   metric='euclidean', z_score=0,\n                   cmap='RdBu_r', center=0, \n                   figsize=(10, 8), \n                   row_colors=condition_colors,\n                   cbar_kws={'label': 'Z-score'})\n```\n\n**Joint distributions with marginals:**\n```python\n# Bivariate distribution with context\ng = sns.jointplot(data=df, x='gene1', y='gene2',\n                  hue='treatment', kind='scatter',\n                  height=6, ratio=4, marginal_kws={'kde': True})\n```\n\n#### Common Seaborn Issues and Solutions\n\n**Issue: Legend outside plot area**\n```python\ng = sns.relplot(...)\ng._legend.set_bbox_to_anchor((0.9, 0.5))\n```\n\n**Issue: Overlapping labels**\n```python\nplt.xticks(rotation=45, ha='right')\nplt.tight_layout()\n```\n\n**Issue: Text too small at final size**\n```python\nsns.set_context('paper', font_scale=1.2)  # Increase if needed\n```\n\n#### Additional Resources\n\nFor more detailed seaborn information, see:\n- `scientific-skills\u002Fseaborn\u002FSKILL.md` - Comprehensive seaborn documentation\n- `scientific-skills\u002Fseaborn\u002Freferences\u002Fexamples.md` - Practical use cases\n- `scientific-skills\u002Fseaborn\u002Freferences\u002Ffunction_reference.md` - Complete API reference\n- `scientific-skills\u002Fseaborn\u002Freferences\u002Fobjects_interface.md` - Modern declarative API\n\n### Plotly\n- Interactive figures for exploration\n- Export static images for publication\n- Configure for publication quality:\n```python\nfig.update_layout(\n    font=dict(family='Arial, sans-serif', size=10),\n    plot_bgcolor='white',\n    # ... see matplotlib_examples.md Example 8\n)\nfig.write_image('figure.png', scale=3)  # scale=3 gives ~300 DPI\n```\n\n## Resources\n\n### References Directory\n\n**Load these as needed for detailed information:**\n\n- **`publication_guidelines.md`**: Comprehensive best practices\n  - Resolution and file format requirements\n  - Typography guidelines\n  - Layout and composition rules\n  - Statistical rigor requirements\n  - Complete publication checklist\n\n- **`color_palettes.md`**: Color usage guide\n  - Colorblind-friendly palette specifications with RGB values\n  - Sequential and diverging colormap recommendations\n  - Testing procedures for accessibility\n  - Domain-specific palettes (genomics, microscopy)\n\n- **`journal_requirements.md`**: Journal-specific specifications\n  - Technical requirements by publisher\n  - File format and DPI specifications\n  - Figure dimension requirements\n  - Quick reference table\n\n- **`matplotlib_examples.md`**: Practical code examples\n  - 10 complete working examples\n  - Line plots, bar plots, heatmaps, multi-panel figures\n  - Journal-specific figure examples\n  - Tips for each library (matplotlib, seaborn, plotly)\n\n### Scripts Directory\n\n**Use these helper scripts for automation:**\n\n- **`figure_export.py`**: Export utilities\n  - `save_publication_figure()`: Save in multiple formats with correct DPI\n  - `save_for_journal()`: Use journal-specific requirements automatically\n  - `check_figure_size()`: Verify dimensions meet journal specs\n  - Run directly: `python scripts\u002Ffigure_export.py` for examples\n\n- **`style_presets.py`**: Pre-configured styles\n  - `apply_publication_style()`: Apply preset styles (default, nature, science, cell)\n  - `set_color_palette()`: Quick palette switching\n  - `configure_for_journal()`: One-command journal configuration\n  - Run directly: `python scripts\u002Fstyle_presets.py` to see examples\n\n### Assets Directory\n\n**Use these files in figures:**\n\n- **`color_palettes.py`**: Importable color definitions\n  - All recommended palettes as Python constants\n  - `apply_palette()` helper function\n  - Can be imported directly into notebooks\u002Fscripts\n\n- **Matplotlib style files**: Use with `plt.style.use()`\n  - `publication.mplstyle`: General publication quality\n  - `nature.mplstyle`: Nature journal specifications\n  - `presentation.mplstyle`: Larger fonts for posters\u002Fslides\n\n## Workflow Summary\n\n**Recommended workflow for creating publication figures:**\n\n1. **Plan**: Determine target journal, figure type, and content\n2. **Configure**: Apply appropriate style for journal\n   ```python\n   from style_presets import configure_for_journal\n   configure_for_journal('nature', 'single')\n   ```\n3. **Create**: Build figure with proper labels, colors, statistics\n4. **Verify**: Check size, fonts, colors, accessibility\n   ```python\n   from figure_export import check_figure_size\n   check_figure_size(fig, journal='nature')\n   ```\n5. **Export**: Save in required formats\n   ```python\n   from figure_export import save_for_journal\n   save_for_journal(fig, 'figure1', 'nature', 'combination')\n   ```\n6. **Review**: View at final size in manuscript context\n\n## Common Pitfalls to Avoid\n\n1. **Font too small**: Text unreadable when printed at final size\n2. **JPEG format**: Never use JPEG for graphs\u002Fplots (creates artifacts)\n3. **Red-green colors**: ~8% of males cannot distinguish\n4. **Low resolution**: Pixelated figures in publication\n5. **Missing units**: Always label axes with units\n6. **3D effects**: Distorts perception, avoid completely\n7. **Chart junk**: Remove unnecessary gridlines, decorations\n8. **Truncated axes**: Start bar charts at zero unless scientifically justified\n9. **Inconsistent styling**: Different fonts\u002Fcolors across figures in same manuscript\n10. **No error bars**: Always show uncertainty\n\n## Final Checklist\n\nBefore submitting figures, verify:\n\n- [ ] Resolution meets journal requirements (300+ DPI)\n- [ ] File format is correct (vector for plots, TIFF for images)\n- [ ] Figure size matches journal specifications\n- [ ] All text readable at final size (≥6 pt)\n- [ ] Colors are colorblind-friendly\n- [ ] Figure works in grayscale\n- [ ] All axes labeled with units\n- [ ] Error bars present with definition in caption\n- [ ] Panel labels present and consistent\n- [ ] No chart junk or 3D effects\n- [ ] Fonts consistent across all figures\n- [ ] Statistical significance clearly marked\n- [ ] Legend is clear and complete\n\nUse this skill to ensure scientific figures meet the highest publication standards while remaining accessible to all readers.\n\n",{"name":5,"license":54,"metadata":55,"description":7},"MIT license",{"skill-author":56},"K-Dense Inc.","main","f19b254e8975d0bfddb394686706106930d7964d","Science\u002Fresearch-and-communication\u002Fscientific-visualization","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus","https:\u002F\u002Fgithub.com\u002Fendman100","2026-11-12 18:13:37",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add endman100\u002Fskill-router-nexus --skill scientific-visualization",{"tool":69,"command":70},"bunx","bunx skills add endman100\u002Fskill-router-nexus --skill scientific-visualization",{"tool":72,"command":73},"pnpm","pnpm dlx skills add endman100\u002Fskill-router-nexus --skill scientific-visualization","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002FSKILL.md",true,[77,83,89,93,97,103,107,111,115,119],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"assets\u002Fcolor_palettes.py","SCRIPT","脚本",5754,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Fassets\u002Fcolor_palettes.py",{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"assets\u002Fnature.mplstyle","ASSET","资产文件",1449,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Fassets\u002Fnature.mplstyle",{"path":90,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":91,"sourceHtmlUrl":92},"assets\u002Fpresentation.mplstyle",1309,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Fassets\u002Fpresentation.mplstyle",{"path":94,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":95,"sourceHtmlUrl":96},"assets\u002Fpublication.mplstyle",1474,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Fassets\u002Fpublication.mplstyle",{"path":98,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Fcolor_palettes.md","REFERENCE","参考文档",9861,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Freferences\u002Fcolor_palettes.md",{"path":104,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":105,"sourceHtmlUrl":106},"references\u002Fjournal_requirements.md",9533,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Freferences\u002Fjournal_requirements.md",{"path":108,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002Fmatplotlib_examples.md",18103,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Freferences\u002Fmatplotlib_examples.md",{"path":112,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":113,"sourceHtmlUrl":114},"references\u002Fpublication_guidelines.md",8556,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Freferences\u002Fpublication_guidelines.md",{"path":116,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":117,"sourceHtmlUrl":118},"scripts\u002Ffigure_export.py",10904,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Fscripts\u002Ffigure_export.py",{"path":120,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":121,"sourceHtmlUrl":122},"scripts\u002Fstyle_presets.py",12199,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fresearch-and-communication\u002Fscientific-visualization\u002Fscripts\u002Fstyle_presets.py",[124,148,180,202,211,235],{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":128,"sourceHtmlUrl":129,"categories":130,"keywords":136,"publishedAt":49},"01M6MPCT5BXVER8HQZTW3QE9AS","create-master","基于佛教经典文献，生成特定高僧大德的 AI 教学角色","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FMetaphysics-and-Spirituality\u002FMaster-skill\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FMetaphysics-and-Spirituality\u002FMaster-skill\u002FSKILL.md",[131],{"categoryNo":132,"categoryName":133,"taxonomyType":134,"taxonomyTypeDesc":135},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[137,138,139,140,141,142,143,144,145,146,147],"create master","master","create","生成","true","webfetch","edit","write","read","grep","Bash",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":152,"sourceHtmlUrl":153,"categories":154,"keywords":162,"publishedAt":49},"01M6M43AKE95Y64E1JRXEF5QQ3","writing-dna-skill","从至少 20 篇完整文章中蒸馏可复用的写作 DNA，分析语言、文章结构、选题逻辑、素材策略、认知框架和视觉风格，并生成 Writing-DNA.md；按该 DNA 写作时会读取全部蒸馏产物和 5 篇相关原文。用于中英文作者、账号、品牌或出版物的风格分析与一致性写作。 Distill reusable Writing DNA from at least 20 complete articles for Chinese or English authors, publications, brands, and accounts; use for language, structure, topic logic, source strategy, cognitive-frame, and visual-style analysis.","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fwriting-dna-skill\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fwriting-dna-skill\u002FSKILL.md",[155,158,159],{"categoryNo":156,"categoryName":157,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":160,"categoryName":161,"taxonomyType":134,"taxonomyTypeDesc":135},"01JBSEEDCAT000000000000036","内容创作者",[163,164,165,166,167,168,169,170,171,172,43,173,174,140,175,176,177,33,178,179],"writing dna skill","DNA","writing","strategy","english","logic","visual","structure","chinese","reusable","style","distill","analysis","frame","source","at","complete",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":184,"sourceHtmlUrl":185,"categories":186,"keywords":189,"publishedAt":49},"01M6M428TTCGQ4ME3KY99VN037","stop-slop","Remove AI writing patterns from prose. Use when drafting, editing, or reviewing text to eliminate predictable AI tells.","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fstop-slop\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fstop-slop\u002FSKILL.md",[187,188],{"categoryNo":156,"categoryName":157,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":160,"categoryName":161,"taxonomyType":134,"taxonomyTypeDesc":135},[190,191,192,193,31,194,195,196,197,43,198,199,200,33,201,165],"slop","stop slop","stop","drafting","drafts","https","patterns","prose","remove","editing","text","content",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":206,"sourceHtmlUrl":207,"categories":208,"keywords":209,"publishedAt":49},"01M6M41X0B7EBX42TK435DMGGR","shuorenhua","检查和清理中英文文本里的 AI 套路，适用于“去 AI 味”“说人话”“自然一点”“别像模板”“先标问题”这类改写和审稿需求；按场景控制力度，同时保留事实、术语、语域和责任主体。","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fshuorenhua\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fshuorenhua\u002FSKILL.md",[],[204,210],"文本",{"skillNo":212,"name":213,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":215,"sourceHtmlUrl":216,"categories":217,"keywords":218,"publishedAt":49},"01M6M3ZD12WBEW5KXKDM4N6DFG","naming","Name products, SaaS, brands, open source projects, bots, and apps. Use when the user needs to name something, find a brand name, or pick a product name. Metaphor-driven process that produces memorable, meaningful names and avoids AI slop.","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fnaming-main\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fnaming-main\u002FSKILL.md",[],[213,219,220,221,222,223,43,224,145,177,225,226,227,228,147,229,230,231,232,31,233,234,190],"repo","websearch","product name","apps","bots","view","brand","pick","gh","projects","open","saas","open source","product","describe","ai slop",{"skillNo":236,"name":237,"nameZh":6,"description":238,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":239,"sourceHtmlUrl":240,"categories":241,"keywords":243,"publishedAt":49},"01M6M3YVXAFAAWJ7F6JMPFREYE","humanizer-zh","去除文本中的 AI 生成痕迹。适用于编辑或审阅文本，使其听起来更自然、更像人类书写。\n基于维基百科的\"AI 写作特征\"综合指南。检测并修复以下模式：夸大的象征意义、\n宣传性语言、以 -ing 结尾的肤浅分析、模糊的归因、破折号过度使用、三段式法则、\nAI 词汇、否定式排比、过多的连接性短语。","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fhumanizer-zh\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fhumanizer-zh\u002FSKILL.md",[242],{"categoryNo":156,"categoryName":157,"taxonomyType":20,"taxonomyTypeDesc":21},[244,245,246,145,144,143,165,140,210,247,190,192],"humanizer","zh","humanizer zh","翻译"]