Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Interactive visualization library. Use when you need hover info, zoom, pan, or web-embeddable charts. Best for dashboards, exploratory analysis, and presentations. For static publication figures use matplotlib or scientific-visualization.
.claude/skills/sickn33-plotly/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | 189% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 123% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 124% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 280% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 360% | 0% |
Python graphing library for creating interactive, publication-quality visualizations with 40+ chart types.
Install Plotly:
bashuv pip install plotly
Basic usage with Plotly Express (high-level API):
pythonimport plotly.express as px import pandas as pd df = pd.DataFrame({ 'x': [1, 2, 3, 4], 'y': [10, 11, 12, 13] }) fig = px.scatter(df, x='x', y='y', title='My First Plot') fig.show()
For quick, standard visualizations with sensible defaults:
See reference/plotly-express.md for complete guide.
For fine-grained control and custom visualizations:
See reference/graph-objects.md for complete guide.
Note: Plotly Express returns graph objects Figure, so you can combine approaches:
pythonfig = px.scatter(df, x='x', y='y') fig.update_layout(title='Custom Title') # Use go methods on px figure fig.add_hline(y=10) # Add shapes
Plotly supports 40+ chart types organized into categories:
Basic Charts: scatter, line, bar, pie, area, bubble
Statistical Charts: histogram, box plot, violin, distribution, error bars
Scientific Charts: heatmap, contour, ternary, image display
Financial Charts: candlestick, OHLC, waterfall, funnel, time series
Maps: scatter maps, choropleth, density maps (geographic visualization)
3D Charts: scatter3d, surface, mesh, cone, volume
Specialized: sunburst, treemap, sankey, parallel coordinates, gauge
For detailed examples and usage of all chart types, see reference/chart-types.md.
Subplots: Create multi-plot figures with shared axes:
pythonfrom plotly.subplots import make_subplots import plotly.graph_objects as go fig = make_subplots(rows=2, cols=2, subplot_titles=('A', 'B', 'C', 'D')) fig.add_trace(go.Scatter(x=[1, 2], y=[3, 4]), row=1, col=1)
Templates: Apply coordinated styling:
pythonfig = px.scatter(df, x='x', y='y', template='plotly_dark') # Built-in: plotly_white, plotly_dark, ggplot2, seaborn, simple_white
Customization: Control every aspect of appearance:
For complete layout and styling options, see reference/layouts-styling.md.
Built-in interactive features:
python# Custom hover template fig.update_traces( hovertemplate='<b>%{x}</b><br>Value: %{y:.2f}<extra></extra>' ) # Add rangeslider fig.update_xaxes(rangeslider_visible=True) # Animations fig = px.scatter(df, x='x', y='y', animation_frame='year')
For complete interactivity guide, see reference/export-interactivity.md.
Interactive HTML:
pythonfig.write_html('chart.html') # Full standalone fig.write_html('chart.html', include_plotlyjs='cdn') # Smaller file
Static Images (requires kaleido):
bashuv pip install kaleido
pythonfig.write_image('chart.png') # PNG fig.write_image('chart.pdf') # PDF fig.write_image('chart.svg') # SVG
For complete export options, see reference/export-interactivity.md.
pythonimport plotly.express as px # Scatter plot with trendline fig = px.scatter(df, x='temperature', y='yield', trendline='ols') # Heatmap from matrix fig = px.imshow(correlation_matrix, text_auto=True, color_continuous_scale='RdBu') # 3D surface plot import plotly.graph_objects as go fig = go.Figure(data=[go.Surface(z=z_data, x=x_data, y=y_data)])
python# Distribution comparison fig = px.histogram(df, x='values', color='group', marginal='box', nbins=30) # Box plot with all points fig = px.box(df, x='category', y='value', points='all') # Violin plot fig = px.violin(df, x='group', y='measurement', box=True)
python# Time series with rangeslider fig = px.line(df, x='date', y='price') fig.update_xaxes(rangeslider_visible=True) # Candlestick chart import plotly.graph_objects as go fig = go.Figure(data=[go.Candlestick( x=df['date'], open=df['open'], high=df['high'], low=df['low'], close=df['close'] )])
pythonfrom plotly.subplots import make_subplots import plotly.graph_objects as go fig = make_subplots( rows=2, cols=2, subplot_titles=('Scatter', 'Bar', 'Histogram', 'Box'), specs=[[{'type': 'scatter'}, {'type': 'bar'}], [{'type': 'histogram'}, {'type': 'box'}]] ) fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]), row=1, col=1) fig.add_trace(go.Bar(x=['A', 'B'], y=[1, 2]), row=1, col=2) fig.add_trace(go.Histogram(x=data), row=2, col=1) fig.add_trace(go.Box(y=data), row=2, col=2) fig.update_layout(height=800, showlegend=False)
For interactive web applications, use Dash (Plotly's web app framework):
bashuv pip install dash
pythonimport dash from dash import dcc, html import plotly.express as px app = dash.Dash(__name__) fig = px.scatter(df, x='x', y='y') app.layout = html.Div([ html.H1('Dashboard'), dcc.Graph(figure=fig) ]) app.run_server(debug=True)
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | pass→pass | 7,330 | 6,760 | -8% | 1 | 1 | 0% | 1,552 | 3,462 | +123% | 0 | 0 | — |
case-01 | pass→pass | 6,291 | 2,731 | -57% | 1 | 1 | 0% | 1,136 | 2,543 | +124% | 0 | 0 | — |
case-03 | pass→pass | 3,824 | 2,947 | -23% | 1 | 1 | 0% | 668 | 2,538 | +280% | 0 | 0 | — |
case-04 | pass→pass | 2,974 | 1,995 | -33% | 1 | 1 | 0% | 520 | 2,390 | +360% | 0 | 0 | — |
case-05 | pass→pass | 4,075 | 2,972 | -27% | 1 | 1 | 0% | 747 | 2,596 | +248% | 0 | 0 | — |
case-06 | pass→pass | 3,395 | 3,033 | -11% | 1 | 1 | 0% | 696 | 2,658 | +282% | 0 | 0 | — |
case-07 | pass→pass | 2,886 | 2,117 | -27% | 1 | 1 | 0% | 564 | 2,417 | +329% | 0 | 0 | — |
case-08 | pass→pass | 4,076 | 4,840 | +19% | 1 | 1 | 0% | 841 | 2,939 | +249% | 0 | 0 | — |
case-09 | pass→pass | 10,323 | 4,117 | -60% | 1 | 1 | 0% | 2,067 | 2,872 | +39% | 0 | 0 | — |
case-10 | pass→pass | 3,248 | 3,019 | -7% | 1 | 1 | 0% | 534 | 2,623 | +391% | 0 | 0 | — |
case-11 | pass→pass | 3,245 | 3,554 | +10% | 1 | 1 | 0% | 562 | 2,589 | +361% | 0 | 0 | — |
case-12 | pass→pass | 4,110 | 4,180 | +2% | 1 | 1 | 0% | 849 | 2,875 | +239% | 0 | 0 | — |
case-13 | fail→pass | 4,817 | 3,694 | -23% | 1 | 1 | 0% | 937 | 2,704 | +189% | 0 | 0 | — |
case-14 | pass→pass | 3,378 | 3,398 | +1% | 1 | 1 | 0% | 546 | 2,639 | +383% | 0 | 0 | — |
case-15 | pass→pass | 2,782 | 2,432 | -13% | 1 | 1 | 0% | 494 | 2,506 | +407% | 0 | 0 | — |
case-16 | pass→pass | 3,159 | 3,695 | +17% | 1 | 1 | 0% | 540 | 2,533 | +369% | 0 | 0 | — |
case-17 | pass→pass | 6,500 | 3,709 | -43% | 1 | 1 | 0% | 1,278 | 2,637 | +106% | 0 | 0 | — |
case-18 | pass→pass | 2,717 | 2,330 | -14% | 1 | 1 | 0% | 437 | 2,440 | +458% | 0 | 0 | — |
case-19 | pass→pass | 6,238 | 4,811 | -23% | 1 | 1 | 0% | 1,305 | 3,013 | +131% | 0 | 0 | — |
case-20 | pass→pass | 16,323 | 8,766 | -46% | 1 | 1 | 0% | 3,366 | 3,880 | +15% | 0 | 0 | — |
case-21 | pass→pass | 5,211 | 3,763 | -28% | 1 | 1 | 0% | 948 | 2,622 | +177% | 0 | 0 | — |
case-22 | pass→pass | 14,380 | 7,520 | -48% | 1 | 1 | 0% | 2,715 | 3,338 | +23% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.