Build charts people can explore, not just look at.
Enter your name. Complete at least 12 practice cases to unlock the Certificate of Participation.
Plotly builds a figure object that contains visual data layers called traces plus layout instructions. Plotly Express creates that figure quickly; Graph Objects lets you work closer to the structure.
Think of a dashboard chart as a stage: traces are the actors and layout is the stage design. Plotly Express casts the scene quickly; Graph Objects lets you direct every element.
import plotly.express as px
fig = px.scatter(
df,
x="requests",
y="resolution_days",
color="department"
)
fig.show()Start with Plotly Express unless you already know you need specialized trace-by-trace control.
Plotly Express turns tidy DataFrames into complete interactive figures with concise commands. The analytical question should determine the chart type—not the library’s feature list.
A manager asks whether workload is related to resolution time. One scatter plot can show the relationship; color can separate departments and hover can expose details.
fig = px.line(
monthly,
x="month",
y="revenue",
color="region",
markers=True,
title="Monthly Revenue by Region"
)
fig.show()Choose the simplest chart that answers the business question. Interactivity does not rescue a weak chart choice.
Interactive charts become valuable when exploration reveals useful context. Plotly lets you encode dimensions visually and carry extra fields into hover without cluttering the canvas.
Instead of labeling every point with department, employee count and budget, show only the essential visual encodings and reveal the extra context on hover.
fig = px.scatter(
df,
x="requests",
y="resolution_days",
color="department",
size="budget",
hover_name="service",
hover_data={"manager": True, "budget": ":$,.0f"}
)
fig.show()Use hover to reveal secondary context, not to hide the chart’s main message.
Faceting creates small multiples that preserve a common visual grammar. Animation can show change through ordered frames, but both techniques work only when the result remains easy to read.
You need to compare the same KPI across branches. Instead of eight separate charts, facet by branch and keep the axes and visual encodings consistent.
fig = px.bar(
df,
x="month",
y="requests",
color="service",
facet_col="branch",
facet_col_wrap=2
)
fig.show()Facet when side-by-side comparison matters; animate only when motion reveals a pattern that static views would obscure.
A Plotly chart still needs visual hierarchy. Titles, axis labels, legends, templates and spacing should reduce interpretation time rather than decorate the page.
A chart can be technically interactive and still fail because the title says “Figure 1,” the axis says “value,” and the legend is ambiguous. Clear language is part of the analysis.
fig.update_layout(
title="Service Demand vs Resolution Time",
template="plotly_white",
legend_title_text="Department",
margin=dict(l=40, r=30, t=70, b=40)
)
fig.update_xaxes(title="Monthly Requests")
fig.update_yaxes(title="Average Resolution Days")Design the chart so a first-time viewer can understand the question before touching hover or zoom.
When a chart needs mixed trace types, custom layering or specialized subplot layouts, Graph Objects gives direct access to figure components while keeping Plotly’s interactive engine.
You want bars for monthly cases and a line for average handling time in one coordinated figure. That is a good moment to move below the Plotly Express abstraction.
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(go.Bar(x=df["month"], y=df["cases"], name="Cases"))
fig.add_trace(
go.Scatter(x=df["month"], y=df["avg_days"], name="Avg Days"),
secondary_y=True
)
fig.show()Use Graph Objects when the analytical composition demands control—not just because it looks more advanced.
Plotly’s built-in interaction lets users inspect dense charts without creating a separate interface. The best controls narrow attention while preserving the analytical context.
A two-year time series is useful at a glance, but an analyst may need to isolate the last quarter. A range slider or zoom can support both overview and detail in the same figure.
fig = px.line(df, x="date", y="requests", color="service")
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=[
dict(count=1, label="1m", step="month", stepmode="backward"),
dict(step="all", label="All")
]
)
)
fig.show()Every control should answer a plausible user question. Remove controls that create motion without insight.
The final skill is delivery. Plotly figures can be shown in notebooks, saved as interactive HTML, exported as static images with the appropriate engine, or used as building blocks for richer web applications.
A chart for an analyst may stay interactive in HTML, while the same insight may need a static version for a slide deck. Delivery format should follow the audience and environment.
# Interactive browser file
fig.write_html("service_dashboard.html")
# Static export requires a compatible image export engine
# fig.write_image("service_dashboard.png")
# Re-open the HTML in a browser to validate the final experience.Share the most interactive format the audience can reliably use, but always keep a reproducible source workflow behind it.
Open each item only after answering it in your own words.
Plotly Express is high-level; Graph Objects provides lower-level control.
Hover reveals detail on demand.
Facets support simultaneous comparison; animation emphasizes progression.
Use it when the analytical composition needs deeper control.
Validate both the analysis and the delivery experience.
| Need | Matplotlib | Seaborn | Plotly |
|---|---|---|---|
| Precise low-level static control | Strong | Uses Matplotlib underneath | Strong through Graph Objects, but web-first |
| Fast statistical visualization from tidy data | Possible | Strong | Strong for many analytical charts |
| Interactive hover, zoom and browser sharing | Limited by default | Limited by default | Strong |
| Interactive dashboard foundation | Possible with other frameworks | Possible with other frameworks | Natural fit |
Choose based on analysis, control and delivery needs.
The technical concepts in this training follow Plotly’s official Python documentation.
“I can build, refine and share interactive Plotly visualizations for analytical decision-making.”
Complete at least 12 of the 24 practice cases (50%) and enter your name.