From Omics Skills
Create publication-quality matplotlib/seaborn charts with readable axes, tight layout, curated palettes, and Tufte-style high-data-ink design.
How this skill is triggered — by the user, by Claude, or both
Slash command
/omics-skills:beautiful-data-viz [medium=notebook|paper|slides] [background=light|dark][medium=notebook|paper|slides] [background=light|dark]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create polished, publication-ready visualizations in Python/Jupyter with strong typography, clean layout, accessible color choices, and high data-ink. The default style is restrained: show the data, remove non-data decoration, label directly when possible, and add only the context needed to interpret the finding.
Create polished, publication-ready visualizations in Python/Jupyter with strong typography, clean layout, accessible color choices, and high data-ink. The default style is restrained: show the data, remove non-data decoration, label directly when possible, and add only the context needed to interpret the finding.
| Task | Action |
|---|---|
| Apply style | Use assets/beautiful_style.py helpers |
| Pick palette | See references/palettes.md |
| QA checklist | See references/checklist.md |
| Plot recipes | See examples/recipes.md |
| Tufte finish | Use direct_label, annotate_point, apply_range_frame, or sparkline from assets/beautiful_style.py |
from assets.beautiful_style import set_beautiful_style, finalize_axes
set_beautiful_style(medium="paper", background="light")
# build plot here
finalize_axes(ax, xlabel="Time (days)", ylabel="Value", tight=True)
from assets.beautiful_style import apply_range_frame, direct_label
ax.plot(x, y, color="#666666", linewidth=1.5)
apply_range_frame(ax, x, y)
direct_label(ax, x, y, "Observed", color="#666666")
Issue: Labels overlap or are unreadable Solution: Reduce tick count, rotate labels, or increase figure width.
Issue: Colors are hard to distinguish Solution: Use a colorblind-safe categorical palette and limit categories.
Issue: A chart needs a legend, many colors, and a second y-axis to fit Solution: Split it into small multiples with shared scales and direct labels.
Issue: Every figure appears twice in the executed Jupyter notebook
Solution: The matplotlib inline backend's flush_figures post-execute hook auto-displays every open figure as display_data, and the cell's fig return value produces a second copy as execute_result. Fix by unregistering the hook in the preamble cell:
plt.ioff()
try:
from matplotlib_inline.backend_inline import flush_figures
get_ipython().events.unregister("post_execute", flush_figures)
except Exception:
pass
With this fix, only the cell's final fig expression produces output. For figures created inside if/else blocks (where fig is not a top-level expression), use display(fig) explicitly instead of bare fig.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
npx claudepluginhub fmschulz/omics-skills --plugin omics-skills