Seaborn
zLanqing/codex-claude-academic-skills
Statistical visualization with pandas integration. An agent skill from zLanqing/codex-claude-academic-skills.
Interactive visualization with Plotly. An agent skill from jaechang-hits/SciAgent-Skills.
$ npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills plotly-interactive-visualization --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/legacy/plotly-interactive-visualization .claude/skills/plotly-interactive-visualization && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "plotly-interactive-visualization" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/legacy/plotly-interactive-visualization into .claude/skills/plotly-interactive-visualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plotly-interactive-visualization", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jaechang-hits/SciAgent-Skills/tree/main/legacy/plotly-interactive-visualizationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills plotly-interactive-visualization --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/legacy/plotly-interactive-visualization .agents/skills/plotly-interactive-visualization && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "plotly-interactive-visualization" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/legacy/plotly-interactive-visualization into .agents/skills/plotly-interactive-visualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plotly-interactive-visualization", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills plotly-interactive-visualization --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/legacy/plotly-interactive-visualization .cursor/skills/plotly-interactive-visualization && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "plotly-interactive-visualization" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/legacy/plotly-interactive-visualization into .cursor/skills/plotly-interactive-visualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plotly-interactive-visualization", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jaechang-hits/SciAgent-Skills.git --path legacy/plotly-interactive-visualization--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills plotly-interactive-visualization --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/legacy/plotly-interactive-visualization .gemini/skills/plotly-interactive-visualization && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "plotly-interactive-visualization" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/legacy/plotly-interactive-visualization into .gemini/skills/plotly-interactive-visualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plotly-interactive-visualization", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jaechang-hits/SciAgent-Skills plotly-interactive-visualizationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/legacy/plotly-interactive-visualization .github/skills/plotly-interactive-visualization && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "plotly-interactive-visualization" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/legacy/plotly-interactive-visualization into .github/skills/plotly-interactive-visualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plotly-interactive-visualization", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills plotly-interactive-visualization --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/legacy/plotly-interactive-visualization .opencode/skills/plotly-interactive-visualization && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "plotly-interactive-visualization" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/legacy/plotly-interactive-visualization into .opencode/skills/plotly-interactive-visualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "plotly-interactive-visualization", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
plotly-interactive-visualizationInteractive visualization with Plotly. An agent skill from jaechang-hits/SciAgent-Skills.
Plotly Interactive Visualization is an agent skill from jaechang-hits/SciAgent-Skills. Interactive visualization with Plotly. 40+ chart types (scatter, line, heatmap, 3D, geographic) with hover, zoom, pan. Two APIs: Plotly Express (DataFrame) and Graph Objects (fine control). For static publication figures use matplotlib; for statistical grammar use seaborn.
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Data & Analytics, covering Data visualization. It works with Plotly, Matplotlib, Seaborn and pandas. The repository describes itself as: 197 bioinformatics & life science skills for Claude Code and AI agents — BixBench 92.0% accuracy. RNA-seq, single-cell, drug discovery, proteomics, and more. Powers OmicsHorizon. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 82c862c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pipFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
plotly.comdash.plotly.comcommunity.plotly.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Plotly Interactive Visualization loads about 4.5k tokens when it runs. Until then it costs about 77 tokens; SKILL.md has 677 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from jaechang-hits/SciAgent-Skills at commit 82c862c, republished under its MIT licence (© jaechang-hits). 677 words, ~4,540 tokens.
.claude/skills/plotly-interactive-visualization/SKILL.md (or your agent's skills folder).Plotly is a Python graphing library for interactive, web-embeddable visualizations with 40+ chart types. It provides two APIs: Plotly Express (high-level, pandas-native) for quick plots and Graph Objects (low-level) for full customization. Output to interactive HTML, static PNG/PDF/SVG, or Dash web apps.
matplotlib insteadseaborn insteadplotly, pandas, numpykaleido (PNG/PDF/SVG rendering)dash (optional)pip install plotly kaleidoimport plotly.express as px
import pandas as pd
import numpy as np
# Sample data
np.random.seed(42)
df = pd.DataFrame({
"x": np.random.randn(200),
"y": np.random.randn(200),
"group": np.random.choice(["A", "B", "C"], 200),
"size": np.random.uniform(5, 20, 200),
})
fig = px.scatter(df, x="x", y="y", color="group", size="size",
title="Interactive Scatter Plot", hover_data=["group"])
fig.write_html("scatter.html")
fig.write_image("scatter.png", width=800, height=500, scale=2)
print("Saved scatter.html and scatter.png")Quick, one-line charts from pandas DataFrames. Returns go.Figure objects that can be further customized.
import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
"temperature": np.linspace(20, 80, 50),
"yield": 50 + 0.8 * np.linspace(20, 80, 50) + np.random.randn(50) * 5,
"catalyst": np.random.choice(["Pd", "Pt", "Rh"], 50),
})
# Scatter with trendline
fig = px.scatter(df, x="temperature", y="yield", color="catalyst",
trendline="ols", title="Temperature vs Yield")
fig.write_image("scatter_trend.png", width=700, height=450)
print("Saved scatter_trend.png")
# Bar chart
summary = df.groupby("catalyst")["yield"].mean().reset_index()
fig = px.bar(summary, x="catalyst", y="yield", color="catalyst",
title="Mean Yield by Catalyst")
fig.write_image("bar_catalyst.png", width=600, height=400)
print("Saved bar_catalyst.png")# Heatmap from correlation matrix
import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(42)
data = pd.DataFrame(np.random.randn(100, 5), columns=["Gene_A", "Gene_B", "Gene_C", "Gene_D", "Gene_E"])
corr = data.corr()
fig = px.imshow(corr, text_auto=".2f", color_continuous_scale="RdBu_r",
zmin=-1, zmax=1, title="Gene Expression Correlation")
fig.write_image("heatmap.png", width=600, height=500)
print("Saved heatmap.png")Full control over individual traces, layouts, and annotations.
import plotly.graph_objects as go
import numpy as np
# 3D surface plot
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
fig = go.Figure(data=[go.Surface(z=Z, x=X[0], y=y, colorscale="Viridis")])
fig.update_layout(title="3D Surface Plot",
scene=dict(xaxis_title="X", yaxis_title="Y", zaxis_title="Z"))
fig.write_image("surface_3d.png", width=700, height=500)
print("Saved surface_3d.png")# Multi-trace figure with custom styling
import plotly.graph_objects as go
import numpy as np
np.random.seed(42)
x = np.linspace(0, 10, 100)
fig = go.Figure()
fig.add_trace(go.Scatter(x=x, y=np.sin(x), mode="lines", name="sin(x)",
line=dict(color="blue", width=2)))
fig.add_trace(go.Scatter(x=x, y=np.cos(x), mode="lines", name="cos(x)",
line=dict(color="red", width=2, dash="dash")))
fig.add_hline(y=0, line_dash="dot", line_color="gray", opacity=0.5)
fig.add_annotation(x=np.pi/2, y=1, text="sin peak", showarrow=True, arrowhead=2)
fig.update_layout(template="plotly_white", title="Trigonometric Functions",
xaxis_title="x", yaxis_title="f(x)")
fig.write_image("multi_trace.png", width=700, height=400)
print("Saved multi_trace.png")Create figure grids with shared or independent axes.
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import numpy as np
np.random.seed(42)
data = np.random.randn(500)
fig = make_subplots(
rows=2, cols=2,
subplot_titles=("Histogram", "Box Plot", "Scatter", "Violin"),
specs=[[{"type": "histogram"}, {"type": "box"}],
[{"type": "scatter"}, {"type": "violin"}]],
)
fig.add_trace(go.Histogram(x=data, nbinsx=30, name="Hist"), row=1, col=1)
fig.add_trace(go.Box(y=data, name="Box"), row=1, col=2)
fig.add_trace(go.Scatter(x=data[:100], y=data[100:200], mode="markers", name="Scatter"), row=2, col=1)
fig.add_trace(go.Violin(y=data, name="Violin", box_visible=True), row=2, col=2)
fig.update_layout(height=700, width=800, title_text="Multi-Panel Dashboard", showlegend=False)
fig.write_image("subplots.png", width=800, height=700)
print("Saved subplots.png")Distribution comparison, error bars, and statistical annotations.
import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({
"value": np.concatenate([np.random.normal(0, 1, 100), np.random.normal(2, 1.5, 100)]),
"group": ["Control"] * 100 + ["Treatment"] * 100,
})
# Histogram with marginal box plot
fig = px.histogram(df, x="value", color="group", marginal="box",
nbins=30, barmode="overlay", opacity=0.7,
title="Distribution Comparison")
fig.write_image("stat_hist.png", width=700, height=450)
print("Saved stat_hist.png")
# Violin plot with individual points
fig = px.violin(df, x="group", y="value", box=True, points="all",
title="Treatment Effect (Violin + Points)")
fig.write_image("violin.png", width=500, height=450)
print("Saved violin.png")# Error bars
import plotly.graph_objects as go
import numpy as np
conditions = ["Control", "Low Dose", "Med Dose", "High Dose"]
means = [5.2, 7.1, 9.8, 11.3]
sems = [0.4, 0.6, 0.5, 0.8]
fig = go.Figure(data=[go.Bar(
x=conditions, y=means,
error_y=dict(type="data", array=sems, visible=True),
marker_color=["#636EFA", "#EF553B", "#00CC96", "#AB63FA"],
)])
fig.update_layout(title="Dose Response (mean ± SEM)", yaxis_title="Response",
template="plotly_white")
fig.write_image("error_bars.png", width=600, height=400)
print("Saved error_bars.png")Save to interactive HTML, static images, or embed in notebooks.
import plotly.express as px
import pandas as pd
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
# Interactive HTML (full standalone)
fig.write_html("interactive.html")
# HTML with CDN (smaller file, needs internet)
fig.write_html("interactive_cdn.html", include_plotlyjs="cdn")
# Static images (requires kaleido)
fig.write_image("plot.png", width=800, height=500, scale=2) # 2x resolution
fig.write_image("plot.pdf") # Vector PDF
fig.write_image("plot.svg") # Vector SVG
# Get image as bytes (for embedding)
img_bytes = fig.to_image(format="png", width=600, height=400)
print(f"PNG bytes: {len(img_bytes)}")Customize hover, animations, buttons, and range sliders.
import plotly.express as px
import pandas as pd
import numpy as np
# Custom hover template
np.random.seed(42)
df = pd.DataFrame({
"date": pd.date_range("2024-01-01", periods=100),
"price": 100 + np.cumsum(np.random.randn(100) * 2),
"volume": np.random.randint(1000, 5000, 100),
})
fig = px.line(df, x="date", y="price", title="Stock Price",
hover_data={"volume": True, "price": ":.2f"})
fig.update_traces(hovertemplate="<b>%{x|%Y-%m-%d}</b><br>Price: $%{y:.2f}<br>Volume: %{customdata[0]:,}<extra></extra>")
fig.update_xaxes(rangeslider_visible=True)
fig.write_html("timeseries.html")
print("Saved timeseries.html with range slider")Goal: Create a multi-panel interactive dashboard for dataset exploration.
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
import numpy as np
# Sample dataset
np.random.seed(42)
n = 300
df = pd.DataFrame({
"gene_expression": np.random.lognormal(2, 1, n),
"protein_level": np.random.lognormal(1.5, 0.8, n),
"cell_type": np.random.choice(["Neuron", "Astrocyte", "Microglia"], n),
"treatment": np.random.choice(["Control", "Drug_A", "Drug_B"], n),
"viability": np.random.uniform(0.3, 1.0, n),
})
fig = make_subplots(rows=2, cols=2,
subplot_titles=("Expression vs Protein", "Expression by Cell Type",
"Viability by Treatment", "Expression Distribution"))
# Panel 1: Scatter
for ct in df["cell_type"].unique():
sub = df[df["cell_type"] == ct]
fig.add_trace(go.Scatter(x=sub["gene_expression"], y=sub["protein_level"],
mode="markers", name=ct, opacity=0.6), row=1, col=1)
# Panel 2: Box
for ct in df["cell_type"].unique():
fig.add_trace(go.Box(y=df[df["cell_type"]==ct]["gene_expression"],
name=ct, showlegend=False), row=1, col=2)
# Panel 3: Violin
for tx in df["treatment"].unique():
fig.add_trace(go.Violin(y=df[df["treatment"]==tx]["viability"],
name=tx, showlegend=False, box_visible=True), row=2, col=1)
# Panel 4: Histogram
fig.add_trace(go.Histogram(x=df["gene_expression"], nbinsx=30,
name="Expression", showlegend=False), row=2, col=2)
fig.update_layout(height=800, width=1000, title="Exploratory Data Analysis")
fig.write_html("eda_dashboard.html")
fig.write_image("eda_dashboard.png", width=1000, height=800)
print("Saved eda_dashboard.html and eda_dashboard.png")Goal: Create a polished, annotated figure suitable for supplementary materials or presentations.
import plotly.graph_objects as go
import numpy as np
np.random.seed(42)
x = np.linspace(0, 24, 100)
control = 50 + 10 * np.sin(x * np.pi / 12) + np.random.randn(100) * 3
treatment = 70 + 15 * np.sin(x * np.pi / 12 + 0.5) + np.random.randn(100) * 4
fig = go.Figure()
fig.add_trace(go.Scatter(x=x, y=control, mode="lines", name="Control",
line=dict(color="#636EFA", width=2)))
fig.add_trace(go.Scatter(x=x, y=treatment, mode="lines", name="Treatment",
line=dict(color="#EF553B", width=2)))
# Add shaded region for treatment window
fig.add_vrect(x0=6, x1=18, fillcolor="yellow", opacity=0.1, line_width=0,
annotation_text="Treatment Window", annotation_position="top left")
# Add annotation at peak difference
fig.add_annotation(x=12, y=85, text="Peak difference<br>p < 0.001",
showarrow=True, arrowhead=2, font=dict(size=11))
fig.update_layout(
template="plotly_white",
title="Circadian Response to Treatment",
xaxis_title="Time (hours)", yaxis_title="Response (AU)",
font=dict(family="Arial", size=12),
legend=dict(x=0.02, y=0.98),
width=700, height=450,
)
fig.write_image("publication_figure.png", width=700, height=450, scale=3)
print("Saved publication_figure.png (3x resolution)")| Parameter | Module | Default | Range / Options | Effect |
|---|---|---|---|---|
template | update_layout | "plotly" | "plotly_white", "plotly_dark", "ggplot2", "seaborn", "simple_white" | Global figure styling theme |
color_continuous_scale | px / go | varies | "Viridis", "Plasma", "RdBu", "RdBu_r", "Blues" | Color scale for continuous data |
barmode | px.histogram | "relative" | "group", "overlay", "relative", "stack" | How multiple histograms are arranged |
trendline | px.scatter | None | None, "ols", "lowess", "expanding" | Regression line overlay |
marginal | px.scatter/histogram | None | None, "rug", "box", "violin", "histogram" | Marginal distribution display |
scale | write_image | 1 | 1–5 | Image resolution multiplier (2=retina, 3=print) |
include_plotlyjs | write_html | True | True, "cdn", "directory", False | How Plotly.js is bundled in HTML |
opacity | most trace types | 1.0 | 0.0–1.0 | Trace transparency for overlapping data |
Start with Plotly Express, customize with Graph Objects: px functions return go.Figure objects, so you can always add Graph Objects methods after. Don't start with go unless px genuinely cannot express what you need.
fig = px.scatter(df, x="x", y="y", color="group")
fig.update_layout(template="plotly_white") # go method on px figure
fig.add_hline(y=threshold)Use plotly_white template for publication figures: The default plotly template has a gray background that looks unprofessional in papers. plotly_white or simple_white gives a clean look.
Always set explicit width/height for static export: Without dimensions, write_image uses the default viewport size which may not match your target (journal column width, slide dimensions).
Use scale=2 or higher for print-quality images: Default scale=1 produces 72 DPI equivalent. For publications, use scale=3 (216 DPI effective).
Prefer HTML export for interactive data sharing: HTML files are self-contained and can be opened in any browser without Python. Use include_plotlyjs="cdn" to reduce file size.
import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame(np.random.randn(100, 6), columns=[f"Var_{i}" for i in range(6)])
corr = df.corr()
# Mask upper triangle
mask = np.triu(np.ones_like(corr, dtype=bool), k=1)
corr_masked = corr.where(~mask)
fig = px.imshow(corr_masked, text_auto=".2f", color_continuous_scale="RdBu_r",
zmin=-1, zmax=1, title="Correlation Matrix")
fig.write_image("correlation.png", width=600, height=500, scale=2)
print("Saved correlation.png")import plotly.express as px
import pandas as pd
import numpy as np
np.random.seed(42)
frames = []
for year in range(2010, 2025):
n = 50
frames.append(pd.DataFrame({
"x": np.random.randn(n) * (year - 2009),
"y": np.random.randn(n) * (year - 2009),
"size": np.random.uniform(5, 20, n),
"year": year,
}))
df = pd.concat(frames)
fig = px.scatter(df, x="x", y="y", size="size", animation_frame="year",
range_x=[-30, 30], range_y=[-30, 30], title="Animated Scatter")
fig.write_html("animated.html")
print("Saved animated.html")import plotly.express as px
# Built-in gapminder dataset
df = px.data.gapminder().query("year == 2007")
fig = px.choropleth(df, locations="iso_alpha", color="gdpPercap",
hover_name="country", color_continuous_scale="Plasma",
title="GDP per Capita (2007)")
fig.write_image("choropleth.png", width=900, height=500, scale=2)
print("Saved choropleth.png")| Problem | Cause | Solution |
|---|---|---|
write_image fails with ValueError | kaleido not installed | pip install kaleido |
Blank/white image from write_image | Plotly version mismatch with kaleido | Update both: pip install --upgrade plotly kaleido |
| HTML file very large (>10 MB) | Full Plotly.js bundled | Use fig.write_html(path, include_plotlyjs="cdn") |
| Hover data not showing | Column not in DataFrame or wrong name | Check hover_data parameter matches DataFrame columns exactly |
| Subplot traces appear in wrong panel | Incorrect row/col in add_trace | Verify row= and col= match your make_subplots grid (1-indexed) |
| Colors don't match between px and go | Different default color sequences | Set explicitly: fig.update_layout(colorway=px.colors.qualitative.Plotly) |
| Animation slow/choppy | Too many points per frame | Reduce data points or use px.scatter with render_mode="webgl" for large datasets |
© jaechang-hits, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in legacy/plotly-interactive-visualization of jaechang-hits/SciAgent-Skills.
Open the folder on GitHubat commit 82c862c
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in jaechang-hits/SciAgent-Skills, which our catalogue first saw on October 7, 2026.
Plotly Interactive Visualization next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Plotly Interactive Visualization this skilljaechang-hits/SciAgent-Skills | 370 | 1 repos | ~4.5k | Automated safety check: Pass | MIT | |
| SeabornzLanqing/codex-claude-academic-skills | 4.6k | 16 repos | ~4.9k | Automated safety check: Pass | BSD-3-Clause | |
| SeabornK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~3.4k | Automated safety check: Notes | BSD-3-Clause | |
| MatplotlibzLanqing/codex-claude-academic-skills | 4.6k | 18 repos | ~2.9k | Automated safety check: Pass | MIT | |
| Scientific Visualizationmims-harvard/OptimusKG | 146 | 19 repos | ~6.3k | Automated safety check: Pass | MIT | |
| Scientific VisualizationOleafly/Oleafly | 206 | 1 repos | ~3.4k | Automated safety check: Notes | MIT |
zLanqing/codex-claude-academic-skills
Statistical visualization with pandas integration. An agent skill from zLanqing/codex-claude-academic-skills.
K-Dense-AI/scientific-agent-skills
Creates Seaborn statistical visualizations with pandas integration for distributions, relationships, categorical comparisons, regression displays, pair plots, and heatmaps.
zLanqing/codex-claude-academic-skills
Low-level plotting library for full customization. An agent skill from zLanqing/codex-claude-academic-skills.
mims-harvard/OptimusKG
Create publication figures with matplotlib/seaborn/plotly. An agent skill from mims-harvard/OptimusKG.
Oleafly/Oleafly
Create and audit truthful, accessible, publication-ready scientific figures with Matplotlib, Seaborn, or Plotly.
xjtulyc/MedgeClaw
Detects a usable Chinese, Japanese or Korean font and configures matplotlib so chart labels, titles and legends render instead of showing empty boxes.
jaechang-hits/SciAgent-Skills
3Dmol.js WebGL molecular visualization emitted as self-contained HTML.
jaechang-hits/SciAgent-Skills
Constraint-based (COBRA) analysis of genome-scale metabolic models: FBA, FVA, knockouts, flux sampling, production envelopes, gapfilling, media optimization.
jaechang-hits/SciAgent-Skills
Read, write, and edit ChemDraw CDX/CDXML files with RDKit's rdkit.Chem.rdChemDraw plus direct XML editing, always paired with a rendered PNG.
jaechang-hits/SciAgent-Skills
Programmatic PubMed access via NCBI E-utilities REST API. An agent skill from jaechang-hits/SciAgent-Skills.
jaechang-hits/SciAgent-Skills
Scaffold a new SciAgent-Skills entry. An agent skill from jaechang-hits/SciAgent-Skills.
jaechang-hits/SciAgent-Skills
Annotated matrices for single-cell genomics. An agent skill from jaechang-hits/SciAgent-Skills.
Works with
Categories
Interactive visualization with Plotly. An agent skill from jaechang-hits/SciAgent-Skills. Plotly Interactive Visualization is an agent skill from jaechang-hits/SciAgent-Skills. Interactive visualization with Plotly.
Plotly Interactive Visualization fits situations like: tasks that involve Data visualization.
Run `npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a claude-code`. Or copy the skill folder (legacy/plotly-interactive-visualization in jaechang-hits/SciAgent-Skills) into .claude/skills/plotly-interactive-visualization in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a codex`. Or copy the skill folder (legacy/plotly-interactive-visualization in jaechang-hits/SciAgent-Skills) into .agents/skills/plotly-interactive-visualization in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jaechang-hits/SciAgent-Skills --skill plotly-interactive-visualization -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/plotly-interactive-visualization, .gemini/skills/plotly-interactive-visualization, .github/skills/plotly-interactive-visualization and .opencode/skills/plotly-interactive-visualization in your project.
Going by SKILL.md and its folder, Plotly Interactive Visualization needs the command-line tools its instructions call (pip). Our summary lists: Python 3.
SKILL.md names 3 domains. As links in the text: plotly.com, dash.plotly.com and community.plotly.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Plotly Interactive Visualization is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Plotly Interactive Visualization: Seaborn (zLanqing/codex-claude-academic-skills, 4.6k stars), Seaborn (K-Dense-AI/scientific-agent-skills, 48k stars), Matplotlib (zLanqing/codex-claude-academic-skills, 4.6k stars) and Scientific Visualization (mims-harvard/OptimusKG, 146 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jaechang-hits (a GitHub user) maintains it in jaechang-hits/SciAgent-Skills, which has 370 GitHub stars. The repository holds 163 skills in this directory. The repository was last updated on September 29, 2026.
Source: jaechang-hits/SciAgent-Skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.