From researcher
Generate publication-quality data visualizations with matplotlib, seaborn, ggplot2, pgfplots. Triggers: plot data, create chart, visualize results, make figure, bar chart, scatter plot, heatmap, line plot, plot the accuracy curve, plot the loss curve over training epochs, publication plot, statistical plot, data visualization. It writes the plotting code and renders the figure from data you already have; choosing which figure a section needs is figure-suggestions.
How this skill is triggered — by the user, by Claude, or both
Slash command
/researcher:visualizationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Publication-quality data visualization with multiple plotting libraries. Generates actual runnable code that produces journal-ready figures.
Publication-quality data visualization with multiple plotting libraries. Generates actual runnable code that produces journal-ready figures.
This skill runs in the main session: it needs the conversation's data context. For heavy plotting code, you may launch the visualization-agent subagent (pinned to Sonnet in its frontmatter) via the Task/Agent tool; the skill itself does not switch models.
General-purpose plotting. Use for maximum control over every visual element.
plt.subplots()Statistical visualization built on matplotlib. Use for statistical plots with minimal code.
Grammar of graphics. Use when the user works in R or wants faceted figures.
geom_point, geom_line, geom_bar, geom_boxplotfacet_wrap, facet_gridtheme_minimal, theme_classic, theme_bwPublication-ready statistical plots with annotations. Use for figures requiring significance brackets.
ggboxplot, ggbarplot, ggscatter, ggviolin with stat comparisonsstat_compare_means)ggarrange for multi-panel layoutsInteractive HTML plots. Use for supplementary materials or web-based presentations.
Native LaTeX plotting. Use when figures must compile within the manuscript .tex file.
addplot from data files or inline tablesWhen the user provides data without specifying chart type, select based on data characteristics:
| Data Type | Recommended Chart |
|---|---|
| One numeric variable | Histogram, KDE, box plot |
| Two numeric variables | Scatter plot, line plot (if ordered) |
| One categorical + one numeric | Bar chart, box plot, violin plot |
| Two categorical | Heatmap, grouped bar chart |
| Time series | Line plot with date axis |
| Correlation matrix | Heatmap with annotations |
| Distribution comparison | Violin plot, ridge plot, overlaid KDE |
| Part-of-whole | Stacked bar chart (avoid pie charts in academic work) |
| Spatial data | Contour plot, 2D density, map |
| Model performance across conditions | Grouped bar chart with error bars |
Apply journal-specific figure standards:
Default to these palettes unless the user specifies otherwise:
#E69F00, #56B4E9, #009E73, #F0E442, #0072B2, #D55E00, #CC79A7)import matplotlib.pyplot as plt
plt.rcParams.update({
'font.family': 'serif',
'font.size': 10,
'axes.labelsize': 11,
'axes.titlesize': 12,
'xtick.labelsize': 9,
'ytick.labelsize': 9,
'legend.fontsize': 9,
'figure.dpi': 300,
'savefig.dpi': 300,
'savefig.bbox': 'tight',
'axes.spines.top': False,
'axes.spines.right': False,
})
Named figure style presets: default, nature, ieee. Each preset's rcParams and sizing rules are defined once in references/figure-styles.md; load that file rather than duplicating values here.
Presets resolve in one precedence order, highest first: explicit Style: line > trigger phrase > journal inference from manuscript/config.yaml > default.
Style: line (accepted input)The invocation may carry an explicit Style: line, which outranks every other selector:
Plot macro-AUROC against labeled fraction, one line per method.
Style: nature
Style: nature, Style: ieee: apply that preset.Style: default, or no Style: line at all: the no-op path, exactly the output this skill produces today. An omitted Style: line is never an error.default, nature, ieee), and ask which to use.With no Style: line, apply a preset when the user asks for it in prose, for example:
natureieeeIf the user gives neither a Style: line nor a trigger phrase, but manuscript/config.yaml specifies a target journal, map that journal to its preset (Nature-family journals -> nature, IEEE venues -> ieee).
If nothing above resolves, use the default preset. This is the current behavior, unchanged. Always state which preset was applied and why.
Presets restyle only: fonts, sizes, colors, dimensions, DPI. They never change data values or synthetic-data labels.
import pandas as pd
df = pd.read_csv('data/results.csv')
df = pd.read_json('data/results.json')
User provides data directly in the prompt. Parse into a DataFrame or table structure.
Extract data from existing LaTeX tables in manuscript/tables/ and visualize.
fig, axes = plt.subplots(2, 2, figsize=(6.7, 5))
# Label panels: (a), (b), (c), (d)
for ax, label in zip(axes.flat, 'abcd'):
ax.set_title(f'({label})', loc='left', fontweight='bold')
library(ggpubr)
ggarrange(p1, p2, p3, p4, labels = c("a", "b", "c", "d"), ncol = 2, nrow = 2)
Panel labels follow journal convention: lowercase letters in parentheses, bold, top-left.
| Format | Use Case | Command (matplotlib) |
|---|---|---|
| Vector, LaTeX inclusion | plt.savefig('fig.pdf') | |
| PNG | Raster, Word inclusion | plt.savefig('fig.png', dpi=300) |
| SVG | Web, scalable | plt.savefig('fig.svg') |
| EPS | Legacy journal requirement | plt.savefig('fig.eps') |
visualization-agent subagent (Sonnet) via the Task/Agent toolreferences/figure-styles.md, resolve the preset by precedence (explicit Style: line, then trigger phrase, then journal inference from manuscript/config.yaml, then default), apply its rcParams and sizing, and tell the user which preset was appliedfigures/ in appropriate format\includegraphics{} or Word embedding)Generate figure captions following academic conventions:
templates/word/build-docx.js generates headings, paragraphs, and lists only)Alt text is a REQUIRED output of this skill, delivered with every plot (and every preset variant).
Write one or two sentences describing the DATA content: name the axes, the series compared, and the
direction and size of the trend. Never describe styling (colors, fonts, palette); presets restyle
only, so all variants of one plot share ONE data description plus at most a one-clause style note
(for example "(Nature preset: 89 mm single column)"). Do not begin with "Image of" or restate the
caption verbatim. See the Alt Text section of references/figure-styles.md. When the plot is embedded
in Word, templates/word/build-docx.js carries this text into the DOCX image accessibility
properties; for LaTeX inclusion, offer \pdftooltip (pdfcomment package) without claiming PDF/UA.
npx claudepluginhub sokolmarek/researcherCreates publication-ready scientific figures with multi-panel layouts, significance annotations, error bars, colorblind-safe palettes, and journal-specific formatting (Nature, Science, Cell) using matplotlib, seaborn, and plotly.
Uses matplotlib, seaborn, and plotly with publication styles to create journal-ready figures (Nature, Science, Cell). Supports multi-panel layouts, statistical annotations, error bars, and colorblind-safe palettes.
Creates publication-ready scientific figures with multi-panel layouts, error bars, significance annotations, and colorblind-safe palettes. Orchestrates matplotlib, seaborn, and plotly for journal submission (Nature, Science, Cell).