[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M74ZGS87RMGWXQGXG4C24H8W":3,"skill-same:01M74ZGS87RMGWXQGXG4C24H8W":129},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":36,"ownerHtmlUrl":37,"ownerBlogUrl":38,"ownerDescription":39,"updatedAt":40,"install":41,"resources":54},"01M74ZGS87RMGWXQGXG4C24H8W","scientific-visualization",null,"Create and audit truthful, accessible, publication-ready scientific figures with Matplotlib, Seaborn, or Plotly. Use for figure design, multi-panel layouts, uncertainty and missing-data displays, color\u002Fcontrast review, image metadata validation, and journal export planning.","KalarisLabs\u002Fresearch-agent-skills","KalarisLabs","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F300878568?v=4","01M74Y7MT23GXXC56VM6TVSXZY","Kalarislabs","01M74Y7MTQM9REXZX4SNXWX95C",118,"MIT","https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002FSKILL.md",[],[],"2026-11-11 17:47:46",false,"---\nname: scientific-visualization\ndescription: Create and audit truthful, accessible, publication-ready scientific figures with Matplotlib, Seaborn, or Plotly. Use for figure design, multi-panel layouts, uncertainty and missing-data displays, color\u002Fcontrast review, image metadata validation, and journal export planning.\nlicense: MIT\ncompatibility: Requires Python 3.11+ and uv for pinned examples. Bundled CLIs are network-free and load Matplotlib, Pillow, or pypdf only when needed. Plotly static export with Kaleido v1 requires a compatible Chrome\u002FChromium installation.\nallowed-tools: Read Write Edit Bash Glob Grep\nmetadata:\n  version: '1.2'\n  category: visualization-and-presentation\n  maintainer: Kalaris Labs\n  tags: scientific figures, data visualization, publication figures, accessibility, plotting\n---\n\n# Scientific Visualization\n\nBuild figures that preserve scientific meaning before optimizing appearance. Separate universal principles from dated publisher rules, preserve raw data and transformations, use color redundantly, and inspect delivered files rather than trusting plotting defaults.\n\n## Non-negotiable guardrails\n\n- Never alter, hide, invent, or selectively enhance data to improve a figure.\n- Preserve raw tables\u002Fimages, exclusions, missing-value codes, analysis code, normalization, binning, image adjustments, and random seeds.\n- Do not infer journal requirements. Identify the exact journal, article type, figure type, and submission phase; verify its live official guidance.\n- Do not claim that a palette, DPI value, format, or automated report makes a figure accessible or journal-compliant.\n- Do not silently connect missing observations, suppress inconvenient points, upsample images as if detail increased, or tune axes\u002Fdual axes to exaggerate a conclusion.\n- Keep interactive and static outputs as distinct deliverables. Interactive hover is not a substitute for labels, alt text, keyboard access, an accessible data table, or a static fallback.\n\nRead `references\u002Fpublication_guidelines.md` for deceptive-encoding and integrity checks. Read `references\u002Fjournal_requirements.md` only after the target and phase are known.\n\n## Workflow\n\n### 1. Define the evidence and destination\n\nRecord:\n\n- audience and medium: manuscript, web, slide, poster, supplement;\n- exact publisher\u002Fjournal, article type, submission phase, and intended final width;\n- variable semantics, units, sample\u002Freplicate structure, missing\u002Fcensored values;\n- estimator and uncertainty definition;\n- transformations: filtering, aggregation, normalization, smoothing, bins, image processing;\n- source-data paths\u002Fidentifiers and output provenance.\n\nIf requirements are not known, create a provisional general figure and label all publisher choices as pending verification.\n\n### 2. Choose an honest encoding\n\nPrefer position on a common scale. Before coding, check:\n\n- **Bars\u002Fareas:** normally include zero because length\u002Farea is measured from a baseline.\n- **Points\u002Flines:** nonzero limits can be valid; show context and disclose breaks.\n- **Uncertainty:** name SD, SE, CI, percentile, posterior, or another interval; state `n` and the unit of replication.\n- **Raw observations:** show them when feasible; do not let jitter obscure categories\u002Fvalues.\n- **Missing data:** distinguish missing, zero, censored, and excluded; use gaps or explicit model\u002Finterpolation styling.\n- **Area\u002Fvolume:** scale area\u002Fvolume, not radius\u002Fdiameter; avoid decorative 3D.\n- **Log axes:** label the base\u002Ftransform and declare how zero\u002Fnegative values are handled.\n- **Binning\u002Fsmoothing:** record edges, bandwidth\u002Fwindow, method, and sensitivity.\n- **Normalization:** state formula\u002Freference and keep limits consistent across compared panels.\n- **Dual axes:** prefer aligned panels; if unavoidable, justify units and do not engineer apparent correlation.\n- **Images:** preserve originals, disclose whole-image adjustments, show scale bars, and avoid clipped\u002Ferased background.\n\n### 3. Design accessibility in, not after\n\n- Use color plus marker, line style, hatching, direct label, or panel separation.\n- Choose qualitative, sequential, diverging, or cyclic color according to data semantics.\n- Audit foreground\u002Fbackground contrast at the rendered size.\n- Make missing and out-of-range values explicit.\n- Provide alt text, a longer description for complex figures, and underlying data for web delivery.\n- Treat WCAG 2.2 as web guidance: 4.5:1 normal text, 3:1 large text, and 3:1 for graphical objects required for understanding; color cannot be the only cue. Applicability and exceptions matter.\n\nSee `references\u002Fcolor_palettes.md`. A grayscale screen is useful but is not a complete color-vision or accessibility test.\n\n### 4. Implement with scoped styles\n\nUse Matplotlib's object-oriented API and temporary style contexts:\n\n```python\nimport matplotlib.pyplot as plt\n\nfrom style_presets import style_context\n\nwith style_context(\"default\", palette_name=\"okabe_ito_on_white\"):\n    fig, ax = plt.subplots(\n        figsize=(89 \u002F 25.4, 60 \u002F 25.4),\n        layout=\"constrained\",\n    )\n    ax.plot(x, y, marker=\"o\", label=\"Observed\")\n    ax.set(xlabel=\"Time (hours)\", ylabel=\"Response (unit)\")\n    ax.legend()\n```\n\n`layout=\"constrained\"` supports colorbars, nested GridSpec, subfigures, and `subplot_mosaic`. Do not call `tight_layout()` afterward; it disables constrained layout.\n\nFor exact physical dimensions, do not use `bbox_inches=\"tight\"` unless the changed page size is intentional.\n\n#### Color normalization\n\n```python\nimport matplotlib as mpl\n\nnorm = mpl.colors.TwoSlopeNorm(vmin=-2, vcenter=0, vmax=5)\ncmap = mpl.colormaps[\"RdBu_r\"].with_extremes(bad=\"#777777\")\nimage = ax.imshow(values, norm=norm, cmap=cmap, interpolation=\"nearest\")\nfig.colorbar(image, ax=ax, label=\"Change (unit)\")\n```\n\nUse `LogNorm`, `CenteredNorm`, `SymLogNorm`, `BoundaryNorm`, or `TwoSlopeNorm` only when its mapping matches the scientific meaning.\n\n#### Seaborn\n\nSeaborn 0.13.2 uses the current `errorbar` API:\n\n```python\nsns.lineplot(\n    data=frame,\n    x=\"time\",\n    y=\"response\",\n    hue=\"treatment\",\n    style=\"treatment\",\n    markers=True,\n    errorbar=(\"ci\", 95),\n    n_boot=5000,\n    seed=20260723,\n    ax=ax,\n)\n```\n\nAxes-level functions fit custom Matplotlib layouts; figure-level functions create their own figures\u002Ffacets. Do not customize Seaborn's internal artist lists as if they were stable API.\n\n#### Plotly\n\n- Use `write_html()` for interaction and `write_image()`\u002F`plotly.io.write_images()` for static output.\n- Kaleido 1.3.0 requires Chrome\u002FChromium; it no longer bundles Chrome.\n- Current static formats: PNG, JPEG, WebP, SVG, PDF. EPS is Kaleido v0-only.\n- Do not pass deprecated `engine=` or use Orca\u002F`plotly.io.kaleido.scope`.\n- `width`, `height`, and `scale` control pixels; `scale=3` is not inherently “300 DPI.”\n- WebGL traces embed raster content in PDF\u002FSVG.\n- Fully offline exports need local external assets when a figure references MathJax\u002Ftopojson\u002Ftiles.\n\n### 5. Export explicitly and record provenance\n\n```python\nfrom figure_export import export_figure\n\nreport = export_figure(\n    fig,\n    \"outputs\u002Ffigure1\",\n    formats=[\"pdf\", \"png\"],\n    dpi=600,\n    bbox_inches=None,  # preserve figure page dimensions\n    provenance={\n        \"raw_data\": \"data\u002Fsource.csv\",\n        \"transformations\": [\"predeclared QC filter\", \"group mean\"],\n        \"uncertainty\": \"95% bootstrap CI; seed 20260723\",\n        \"missing_data\": \"retained as gaps\",\n    },\n    write_manifest=True,\n)\n```\n\nThe exporter refuses implicit overwrite, writes atomically, keeps vector DPI for embedded rasters, uses TIFF LZW, and can use PDF\u002FPS Type 42 fonts. It does not validate scientific content or publisher acceptance.\n\nFor editable fonts:\n\n- PDF\u002FPS Type 42 embeds TrueType fonts.\n- `svg.fonttype=\"none\"` keeps text editable\u002Fsearchable but does not embed fonts; appearance depends on installed fonts.\n- `svg.fonttype=\"path\"` preserves glyph appearance as paths but loses editable\u002Fsearchable text.\n\nUse an opaque explicit background unless transparency is required; blending against another background changes apparent contrast.\n\n### 6. Inspect, compare, and review\n\n1. Inspect file metadata.\n2. Audit palette contrast\u002Fgrayscale separation.\n3. Compare against a dated publisher snapshot.\n4. View at final size in the manuscript\u002Fweb context.\n5. Manually review fonts, embedded rasters, clipping, legends, scale bars, image integrity, caption, alt text, and source data.\n6. Re-check the live target-journal page immediately before upload.\n\n## Pinned snapshot\n\nThe examples and smoke tests use direct package pins current on 2026-07-23:\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  --with \"matplotlib==3.11.1\" \\\n  --with \"seaborn==0.13.2\" \\\n  --with \"plotly==6.9.0\" \\\n  --with \"kaleido==1.3.0\" \\\n  --with \"pillow==12.3.0\" \\\n  --with \"pypdf==6.14.2\" \\\n  python your_figure.py\n```\n\nThis is a dated direct-dependency snapshot, not a transitive lock. Use the project's uv lock for exact replay; this skill intentionally ships no dependency lock.\n\n## Bundled CLIs\n\nAll helpers are deterministic, network-free, bounded, reject symlink inputs\u002Fdestinations where relevant, and refuse overwrite unless `--force` is explicit.\n\n### Inspect raster\u002Fvector metadata\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  --with \"pillow==12.3.0\" \\\n  python scripts\u002Fimage_metadata.py figure.tiff \\\n  --format tiff --mode RGB --min-dpi 300 --target-width-mm 85 \\\n  --alpha-policy forbid\n```\n\nSupports raster images (Pillow), SVG, PDF (pypdf), and EPS\u002FPS. Reports dimensions, DPI\u002Feffective DPI, mode, alpha, ICC presence, compression, page size, and conservative first-page PDF font resources. It does not inspect every embedded raster in a vector container.\n\n### Audit palette contrast and grayscale\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  python scripts\u002Fpalette_audit.py \\\n  --palette okabe_ito_on_white \\\n  --background FFFFFF \\\n  --role graphical\n```\n\nReports exact WCAG sRGB contrast plus pairwise CIE L* grayscale screening. The grayscale threshold is a heuristic, not a standard.\n\n### Plan\u002Fscreen publisher export\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  python scripts\u002Fexport_plan.py \\\n  --publisher nature \\\n  --figure-type combination \\\n  --width single \\\n  --phase final\n```\n\nAdd `--input figure.pdf` to screen machine-readable properties. Profiles are official-source snapshots accessed 2026-07-23, not automatic compliance rules.\n\n### Preview styles\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  --with \"matplotlib==3.11.1\" \\\n  python scripts\u002Fstyle_preview.py \\\n  --output outputs\u002Fstyle-preview \\\n  --style default \\\n  --palette okabe_ito_on_white \\\n  --formats png,svg\n```\n\n### Inspect\u002Fwrite styles and smoke-test export\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  python scripts\u002Fstyle_presets.py --list\nuv run --isolated --no-project --python 3.13 \\\n  python scripts\u002Fstyle_presets.py --show nature\nuv run --isolated --no-project --python 3.13 \\\n  --with \"matplotlib==3.11.1\" \\\n  python scripts\u002Ffigure_export.py --demo outputs\u002Fexport-smoke --manifest\n```\n\n## Assets\n\n- `assets\u002Fpublication.mplstyle`: general print starting point.\n- `assets\u002Fnature.mplstyle`: dated flagship Nature visual starting point, not a compliance preset.\n- `assets\u002Fpresentation.mplstyle`: larger projected-display style.\n- `assets\u002Fcolor_palettes.py`: importable Okabe-Ito and Paul Tol values with metadata.\n- `assets\u002Fpublisher_profiles.json`: dated, machine-readable planning snapshots.\n\nMatplotlib style files omit `#` in hex colors because `#` begins comments in `.mplstyle` parsing.\n\n## References\n\n- `references\u002Fpublication_guidelines.md`: integrity, deceptive encodings, accessibility, static\u002Finteractive output.\n- `references\u002Fcolor_palettes.md`: palette semantics, exact values, WCAG contrast, grayscale caveats, color management.\n- `references\u002Fjournal_requirements.md`: phase-specific official publisher snapshots.\n- `references\u002Fmatplotlib_examples.md`: current, runnable Matplotlib\u002FSeaborn\u002FPlotly patterns.\n- `references\u002Fsources.md`: official URLs, dates, versions, and research basis.\n\n## Final review checklist\n\n- [ ] Raw data\u002Fimages and transformation code are preserved.\n- [ ] Missing values, exclusions, bins, normalization, and uncertainty are explicit.\n- [ ] Baselines, scales, limits, and area\u002Fvolume encodings are honest.\n- [ ] Color is redundant and rendered contrast was reviewed.\n- [ ] Figure has an accessible description\u002Fdata alternative where applicable.\n- [ ] Physical dimensions, DPI, format, fonts, transparency, and file size were inspected after export.\n- [ ] Publisher rules were verified for the exact journal and phase.\n- [ ] No automated report is presented as a scientific, accessibility, or compliance certification.\n\n## Related skills\n\n- `matplotlib`: Low-level plotting library for full customization.\n- `academic-plotting`: Generates publication-quality figures for ML papers from research context.\n- `seaborn`: Statistical visualization with pandas integration.\n","# Scientific Visualization\n\nBuild figures that preserve scientific meaning before optimizing appearance. Separate universal principles from dated publisher rules, preserve raw data and transformations, use color redundantly, and inspect delivered files rather than trusting plotting defaults.\n\n## Non-negotiable guardrails\n\n- Never alter, hide, invent, or selectively enhance data to improve a figure.\n- Preserve raw tables\u002Fimages, exclusions, missing-value codes, analysis code, normalization, binning, image adjustments, and random seeds.\n- Do not infer journal requirements. Identify the exact journal, article type, figure type, and submission phase; verify its live official guidance.\n- Do not claim that a palette, DPI value, format, or automated report makes a figure accessible or journal-compliant.\n- Do not silently connect missing observations, suppress inconvenient points, upsample images as if detail increased, or tune axes\u002Fdual axes to exaggerate a conclusion.\n- Keep interactive and static outputs as distinct deliverables. Interactive hover is not a substitute for labels, alt text, keyboard access, an accessible data table, or a static fallback.\n\nRead `references\u002Fpublication_guidelines.md` for deceptive-encoding and integrity checks. Read `references\u002Fjournal_requirements.md` only after the target and phase are known.\n\n## Workflow\n\n### 1. Define the evidence and destination\n\nRecord:\n\n- audience and medium: manuscript, web, slide, poster, supplement;\n- exact publisher\u002Fjournal, article type, submission phase, and intended final width;\n- variable semantics, units, sample\u002Freplicate structure, missing\u002Fcensored values;\n- estimator and uncertainty definition;\n- transformations: filtering, aggregation, normalization, smoothing, bins, image processing;\n- source-data paths\u002Fidentifiers and output provenance.\n\nIf requirements are not known, create a provisional general figure and label all publisher choices as pending verification.\n\n### 2. Choose an honest encoding\n\nPrefer position on a common scale. Before coding, check:\n\n- **Bars\u002Fareas:** normally include zero because length\u002Farea is measured from a baseline.\n- **Points\u002Flines:** nonzero limits can be valid; show context and disclose breaks.\n- **Uncertainty:** name SD, SE, CI, percentile, posterior, or another interval; state `n` and the unit of replication.\n- **Raw observations:** show them when feasible; do not let jitter obscure categories\u002Fvalues.\n- **Missing data:** distinguish missing, zero, censored, and excluded; use gaps or explicit model\u002Finterpolation styling.\n- **Area\u002Fvolume:** scale area\u002Fvolume, not radius\u002Fdiameter; avoid decorative 3D.\n- **Log axes:** label the base\u002Ftransform and declare how zero\u002Fnegative values are handled.\n- **Binning\u002Fsmoothing:** record edges, bandwidth\u002Fwindow, method, and sensitivity.\n- **Normalization:** state formula\u002Freference and keep limits consistent across compared panels.\n- **Dual axes:** prefer aligned panels; if unavoidable, justify units and do not engineer apparent correlation.\n- **Images:** preserve originals, disclose whole-image adjustments, show scale bars, and avoid clipped\u002Ferased background.\n\n### 3. Design accessibility in, not after\n\n- Use color plus marker, line style, hatching, direct label, or panel separation.\n- Choose qualitative, sequential, diverging, or cyclic color according to data semantics.\n- Audit foreground\u002Fbackground contrast at the rendered size.\n- Make missing and out-of-range values explicit.\n- Provide alt text, a longer description for complex figures, and underlying data for web delivery.\n- Treat WCAG 2.2 as web guidance: 4.5:1 normal text, 3:1 large text, and 3:1 for graphical objects required for understanding; color cannot be the only cue. Applicability and exceptions matter.\n\nSee `references\u002Fcolor_palettes.md`. A grayscale screen is useful but is not a complete color-vision or accessibility test.\n\n### 4. Implement with scoped styles\n\nUse Matplotlib's object-oriented API and temporary style contexts:\n\n```python\nimport matplotlib.pyplot as plt\n\nfrom style_presets import style_context\n\nwith style_context(\"default\", palette_name=\"okabe_ito_on_white\"):\n    fig, ax = plt.subplots(\n        figsize=(89 \u002F 25.4, 60 \u002F 25.4),\n        layout=\"constrained\",\n    )\n    ax.plot(x, y, marker=\"o\", label=\"Observed\")\n    ax.set(xlabel=\"Time (hours)\", ylabel=\"Response (unit)\")\n    ax.legend()\n```\n\n`layout=\"constrained\"` supports colorbars, nested GridSpec, subfigures, and `subplot_mosaic`. Do not call `tight_layout()` afterward; it disables constrained layout.\n\nFor exact physical dimensions, do not use `bbox_inches=\"tight\"` unless the changed page size is intentional.\n\n#### Color normalization\n\n```python\nimport matplotlib as mpl\n\nnorm = mpl.colors.TwoSlopeNorm(vmin=-2, vcenter=0, vmax=5)\ncmap = mpl.colormaps[\"RdBu_r\"].with_extremes(bad=\"#777777\")\nimage = ax.imshow(values, norm=norm, cmap=cmap, interpolation=\"nearest\")\nfig.colorbar(image, ax=ax, label=\"Change (unit)\")\n```\n\nUse `LogNorm`, `CenteredNorm`, `SymLogNorm`, `BoundaryNorm`, or `TwoSlopeNorm` only when its mapping matches the scientific meaning.\n\n#### Seaborn\n\nSeaborn 0.13.2 uses the current `errorbar` API:\n\n```python\nsns.lineplot(\n    data=frame,\n    x=\"time\",\n    y=\"response\",\n    hue=\"treatment\",\n    style=\"treatment\",\n    markers=True,\n    errorbar=(\"ci\", 95),\n    n_boot=5000,\n    seed=20260723,\n    ax=ax,\n)\n```\n\nAxes-level functions fit custom Matplotlib layouts; figure-level functions create their own figures\u002Ffacets. Do not customize Seaborn's internal artist lists as if they were stable API.\n\n#### Plotly\n\n- Use `write_html()` for interaction and `write_image()`\u002F`plotly.io.write_images()` for static output.\n- Kaleido 1.3.0 requires Chrome\u002FChromium; it no longer bundles Chrome.\n- Current static formats: PNG, JPEG, WebP, SVG, PDF. EPS is Kaleido v0-only.\n- Do not pass deprecated `engine=` or use Orca\u002F`plotly.io.kaleido.scope`.\n- `width`, `height`, and `scale` control pixels; `scale=3` is not inherently “300 DPI.”\n- WebGL traces embed raster content in PDF\u002FSVG.\n- Fully offline exports need local external assets when a figure references MathJax\u002Ftopojson\u002Ftiles.\n\n### 5. Export explicitly and record provenance\n\n```python\nfrom figure_export import export_figure\n\nreport = export_figure(\n    fig,\n    \"outputs\u002Ffigure1\",\n    formats=[\"pdf\", \"png\"],\n    dpi=600,\n    bbox_inches=None,  # preserve figure page dimensions\n    provenance={\n        \"raw_data\": \"data\u002Fsource.csv\",\n        \"transformations\": [\"predeclared QC filter\", \"group mean\"],\n        \"uncertainty\": \"95% bootstrap CI; seed 20260723\",\n        \"missing_data\": \"retained as gaps\",\n    },\n    write_manifest=True,\n)\n```\n\nThe exporter refuses implicit overwrite, writes atomically, keeps vector DPI for embedded rasters, uses TIFF LZW, and can use PDF\u002FPS Type 42 fonts. It does not validate scientific content or publisher acceptance.\n\nFor editable fonts:\n\n- PDF\u002FPS Type 42 embeds TrueType fonts.\n- `svg.fonttype=\"none\"` keeps text editable\u002Fsearchable but does not embed fonts; appearance depends on installed fonts.\n- `svg.fonttype=\"path\"` preserves glyph appearance as paths but loses editable\u002Fsearchable text.\n\nUse an opaque explicit background unless transparency is required; blending against another background changes apparent contrast.\n\n### 6. Inspect, compare, and review\n\n1. Inspect file metadata.\n2. Audit palette contrast\u002Fgrayscale separation.\n3. Compare against a dated publisher snapshot.\n4. View at final size in the manuscript\u002Fweb context.\n5. Manually review fonts, embedded rasters, clipping, legends, scale bars, image integrity, caption, alt text, and source data.\n6. Re-check the live target-journal page immediately before upload.\n\n## Pinned snapshot\n\nThe examples and smoke tests use direct package pins current on 2026-07-23:\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  --with \"matplotlib==3.11.1\" \\\n  --with \"seaborn==0.13.2\" \\\n  --with \"plotly==6.9.0\" \\\n  --with \"kaleido==1.3.0\" \\\n  --with \"pillow==12.3.0\" \\\n  --with \"pypdf==6.14.2\" \\\n  python your_figure.py\n```\n\nThis is a dated direct-dependency snapshot, not a transitive lock. Use the project's uv lock for exact replay; this skill intentionally ships no dependency lock.\n\n## Bundled CLIs\n\nAll helpers are deterministic, network-free, bounded, reject symlink inputs\u002Fdestinations where relevant, and refuse overwrite unless `--force` is explicit.\n\n### Inspect raster\u002Fvector metadata\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  --with \"pillow==12.3.0\" \\\n  python scripts\u002Fimage_metadata.py figure.tiff \\\n  --format tiff --mode RGB --min-dpi 300 --target-width-mm 85 \\\n  --alpha-policy forbid\n```\n\nSupports raster images (Pillow), SVG, PDF (pypdf), and EPS\u002FPS. Reports dimensions, DPI\u002Feffective DPI, mode, alpha, ICC presence, compression, page size, and conservative first-page PDF font resources. It does not inspect every embedded raster in a vector container.\n\n### Audit palette contrast and grayscale\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  python scripts\u002Fpalette_audit.py \\\n  --palette okabe_ito_on_white \\\n  --background FFFFFF \\\n  --role graphical\n```\n\nReports exact WCAG sRGB contrast plus pairwise CIE L* grayscale screening. The grayscale threshold is a heuristic, not a standard.\n\n### Plan\u002Fscreen publisher export\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  python scripts\u002Fexport_plan.py \\\n  --publisher nature \\\n  --figure-type combination \\\n  --width single \\\n  --phase final\n```\n\nAdd `--input figure.pdf` to screen machine-readable properties. Profiles are official-source snapshots accessed 2026-07-23, not automatic compliance rules.\n\n### Preview styles\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  --with \"matplotlib==3.11.1\" \\\n  python scripts\u002Fstyle_preview.py \\\n  --output outputs\u002Fstyle-preview \\\n  --style default \\\n  --palette okabe_ito_on_white \\\n  --formats png,svg\n```\n\n### Inspect\u002Fwrite styles and smoke-test export\n\n```bash\nuv run --isolated --no-project --python 3.13 \\\n  python scripts\u002Fstyle_presets.py --list\nuv run --isolated --no-project --python 3.13 \\\n  python scripts\u002Fstyle_presets.py --show nature\nuv run --isolated --no-project --python 3.13 \\\n  --with \"matplotlib==3.11.1\" \\\n  python scripts\u002Ffigure_export.py --demo outputs\u002Fexport-smoke --manifest\n```\n\n## Assets\n\n- `assets\u002Fpublication.mplstyle`: general print starting point.\n- `assets\u002Fnature.mplstyle`: dated flagship Nature visual starting point, not a compliance preset.\n- `assets\u002Fpresentation.mplstyle`: larger projected-display style.\n- `assets\u002Fcolor_palettes.py`: importable Okabe-Ito and Paul Tol values with metadata.\n- `assets\u002Fpublisher_profiles.json`: dated, machine-readable planning snapshots.\n\nMatplotlib style files omit `#` in hex colors because `#` begins comments in `.mplstyle` parsing.\n\n## References\n\n- `references\u002Fpublication_guidelines.md`: integrity, deceptive encodings, accessibility, static\u002Finteractive output.\n- `references\u002Fcolor_palettes.md`: palette semantics, exact values, WCAG contrast, grayscale caveats, color management.\n- `references\u002Fjournal_requirements.md`: phase-specific official publisher snapshots.\n- `references\u002Fmatplotlib_examples.md`: current, runnable Matplotlib\u002FSeaborn\u002FPlotly patterns.\n- `references\u002Fsources.md`: official URLs, dates, versions, and research basis.\n\n## Final review checklist\n\n- [ ] Raw data\u002Fimages and transformation code are preserved.\n- [ ] Missing values, exclusions, bins, normalization, and uncertainty are explicit.\n- [ ] Baselines, scales, limits, and area\u002Fvolume encodings are honest.\n- [ ] Color is redundant and rendered contrast was reviewed.\n- [ ] Figure has an accessible description\u002Fdata alternative where applicable.\n- [ ] Physical dimensions, DPI, format, fonts, transparency, and file size were inspected after export.\n- [ ] Publisher rules were verified for the exact journal and phase.\n- [ ] No automated report is presented as a scientific, accessibility, or compliance certification.\n\n## Related skills\n\n- `matplotlib`: Low-level plotting library for full customization.\n- `academic-plotting`: Generates publication-quality figures for ML papers from research context.\n- `seaborn`: Statistical visualization with pandas integration.\n",{"name":5,"license":15,"metadata":24,"description":7,"allowed-tools":29,"compatibility":30},{"tags":25,"version":26,"category":27,"maintainer":28},"scientific figures, data visualization, publication figures, accessibility, plotting","1.2","visualization-and-presentation","Kalaris Labs","Read Write Edit Bash Glob Grep","Requires Python 3.11+ and uv for pinned examples. Bundled CLIs are network-free and load Matplotlib, Pillow, or pypdf only when needed. Plotly static export with Kaleido v1 requires a compatible Chrome\u002FChromium installation.","main","29fe36d26127205057d5e0ed8425f6b0e9a8c13a","skills\u002Fscientific-visualization",12,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills","https:\u002F\u002Fdocs.kalarislabs.com\u002Fresearch-agent-skills","https:\u002F\u002Fgithub.com\u002FKalarisLabs","kalarislabs.com","Applied AI lab building the infrastructure for the agentic era","2026-11-07 15:22:41",{"source":8,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add KalarisLabs\u002Fresearch-agent-skills --skill scientific-visualization",{"tool":47,"command":48},"bunx","bunx skills add KalarisLabs\u002Fresearch-agent-skills --skill scientific-visualization",{"tool":50,"command":51},"pnpm","pnpm dlx skills add KalarisLabs\u002Fresearch-agent-skills --skill scientific-visualization","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002FSKILL.md",true,[55,61,67,71,75,79,85,89,93,97,101,105,109,113,117,121,125],{"path":56,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":59,"sourceHtmlUrl":60},"assets\u002Fcolor_palettes.py","SCRIPT","脚本",6483,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fassets\u002Fcolor_palettes.py",{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"assets\u002Fnature.mplstyle","ASSET","资产文件",1619,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fassets\u002Fnature.mplstyle",{"path":68,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":69,"sourceHtmlUrl":70},"assets\u002Fpresentation.mplstyle",1460,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fassets\u002Fpresentation.mplstyle",{"path":72,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":73,"sourceHtmlUrl":74},"assets\u002Fpublication.mplstyle",1817,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fassets\u002Fpublication.mplstyle",{"path":76,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":77,"sourceHtmlUrl":78},"assets\u002Fpublisher_profiles.json",9863,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fassets\u002Fpublisher_profiles.json",{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fcolor_palettes.md","REFERENCE","参考文档",9094,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Freferences\u002Fcolor_palettes.md",{"path":86,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fjournal_requirements.md",10412,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Freferences\u002Fjournal_requirements.md",{"path":90,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fmatplotlib_examples.md",11054,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Freferences\u002Fmatplotlib_examples.md",{"path":94,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fpublication_guidelines.md",12709,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Freferences\u002Fpublication_guidelines.md",{"path":98,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Fsources.md",8837,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Freferences\u002Fsources.md",{"path":102,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":103,"sourceHtmlUrl":104},"scripts\u002F_common.py",4351,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fscripts\u002F_common.py",{"path":106,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":107,"sourceHtmlUrl":108},"scripts\u002Fexport_plan.py",17679,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fscripts\u002Fexport_plan.py",{"path":110,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":111,"sourceHtmlUrl":112},"scripts\u002Ffigure_export.py",22565,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fscripts\u002Ffigure_export.py",{"path":114,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":115,"sourceHtmlUrl":116},"scripts\u002Fimage_metadata.py",26084,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fscripts\u002Fimage_metadata.py",{"path":118,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":119,"sourceHtmlUrl":120},"scripts\u002Fpalette_audit.py",11815,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fscripts\u002Fpalette_audit.py",{"path":122,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":123,"sourceHtmlUrl":124},"scripts\u002Fstyle_presets.py",16734,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fscripts\u002Fstyle_presets.py",{"path":126,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":127,"sourceHtmlUrl":128},"scripts\u002Fstyle_preview.py",7828,"https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscientific-visualization\u002Fscripts\u002Fstyle_preview.py",[130,137,144,151,158,165],{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":19},"01M74ZSRSWD92NYM8TNJRH35DK","zarr-python","Guides use of Zarr-Python 3 for storing chunked, compressed N-dimensional arrays and groups, with local, in-memory, ZIP, and fsspec-backed S3\u002FGCS\u002FHTTP stores, plus NumPy, Dask, and Xarray integration. Covers array creation, resizing and appending, attributes, chunk and shard sizing, codecs, consolidated metadata, and v2-to-v3 migration. Use when creating or opening Zarr arrays or groups, choosing chunk sizes or compression for large datasets, reading or writing arrays on S3 or GCS, appending to time-series arrays, or migrating code from Zarr-Python 2 to 3. Use when setting up parallel I\u002FO with Dask or Xarray. For labeled multi-dimensional datasets, use Xarray instead.","https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fzarr-python\u002FSKILL.md",[],[],{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":19},"01M74ZSK6JG5HKNC1AHF4D97G9","whisper","Transcribes and translates audio with OpenAI's Whisper (openai-whisper Python package and whisper CLI), covering model sizes from tiny to large plus turbo, language specification, initial prompts, word and segment timestamps, temperature fallback, batch processing, and subtitle generation. Use when transcribing speech, podcasts, meetings, or video audio to text. Use when translating non-English speech to English. Use when working with noisy or multilingual audio in any of 99 languages. Use when choosing a Whisper model size for available VRAM. Use when generating subtitles from audio. Not for speaker diarization or live captioning; use AssemblyAI or Deepgram instead.","https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwhisper\u002FSKILL.md",[],[],{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":19},"01M74ZSBYQ2EGDFTTA4ZK6K5TR","weights-and-biases","Logs and tracks machine learning experiments with Weights & Biases (W&B, wandb): metrics, hyperparameters, checkpoints, sweeps, artifacts with lineage, model registry, custom charts and shareable reports. Includes integrations for PyTorch, HuggingFace Transformers, PyTorch Lightning and Keras\u002FTensorFlow. Use when logging training runs and comparing them across configurations, running automated hyperparameter sweeps, versioning datasets and models as artifacts, registering model versions, or sharing results with a team workspace. Use when setting up wandb.init for offline or unstable-connection training. Not for general data versioning outside ML runs.","https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fweights-and-biases\u002FSKILL.md",[],[],{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":19},"01M74ZS5MZTK84WHEQXCVDZ6GB","waypoint-bio","Use when working with Outpost Bio's open microbiome foundation models - the Waypoint checkpoints (Waypoint-6m, Waypoint-45m, Waypoint-170m), the Atlas pretraining corpus, the Compass eight-task benchmark, or the `waypoint` CLI from the `waypoint-bio` package. Covers embedding microbiome samples, fine-tuning on taxonomic abundance data, benchmarking a checkpoint on Compass, pretraining a GPT-2 model on taxonomic abundance profiles, and converting MetaPhlAn, Kraken2, QIIME 2, or MGnify abundance tables into waypoint format.","https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwaypoint-bio\u002FSKILL.md",[],[],{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":19},"01M74ZS0TCW96WJAKSG07C5Z7A","verl-rl-training","Provides guidance for training LLMs with reinforcement learning using verl (Volcano Engine RL). Use when implementing RLHF, GRPO, PPO, or other RL algorithms for LLM post-training at scale with flexible infrastructure backends.","https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fverl-rl-training\u002FSKILL.md",[],[],{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":171,"publishedAt":19},"01M74ZRVG6SSWGT1N3Q55134KA","venue-templates","Prepare journal manuscripts, conference papers, research posters, and grant documents using venue-specific formatting guidance and bundled LaTeX scaffolds. Use when selecting an official template, checking current page or anonymity rules, adapting academic writing to a venue, or inspecting a submission PDF.","https:\u002F\u002Fgithub.com\u002FKalarisLabs\u002Fresearch-agent-skills\u002Fblob\u002Fmain\u002Fskills\u002Fvenue-templates\u002FSKILL.md",[],[]]