Introduction to Plotly Express
Why Plotly?
Matplotlib and Seaborn draw static pictures — great for reports and papers, but a reader can’t poke at them. Plotly draws figures that respond to the mouse:
- Hover tooltips (see the exact value under the cursor)
- Zoom and pan (drag to inspect a busy region)
- Legend toggling (click a series name to hide/show it)
This makes Plotly great for:
- Exploratory analysis (you dig into the data yourself)
- Sharing insights in a browser (no extra software needed)
- Lightweight dashboards (a handful of linked charts on one page)
Plotly Express vs Graph Objects
Plotly is really two APIs layered on top of each other:
plotly.expressplotly.express(pxpx) — a high-level, “one function per chart type” API. You hand it a tidy DataFrame and column names; it builds the whole figure. Start here for almost everything.plotly.graph_objectsplotly.graph_objects(gogo) — the low-level building blocks (go.Scattergo.Scatter,go.Bargo.Bar, …) thatpxpxitself is built from. Reach for it when you need fine controlpxpxdoesn’t expose, or when combining traces manually (see subplots/dashboards later in this phase).
This phase focuses on Plotly Express, because it covers the vast majority of everyday charts with the least code.
Anatomy of a figure
Every Plotly chart is a figure: a Python object holding
- data — one or more traces (a line, a set of bars, a scatter layer…)
- layout — title, axis labels, legend position, margins
- config — export/interaction options (zoom mode, static vs interactive)
px.line(...)px.line(...), px.bar(...)px.bar(...), px.scatter(...)px.scatter(...) etc. all return this same kind of figure object — which is why they share methods like .show().show(), .update_layout().update_layout(), and .write_html().write_html().
First interactive chart
import pandas as pd
import plotly.express as px
df = pd.DataFrame({
"day": [1, 2, 3, 4, 5],
"orders": [120, 140, 130, 160, 155],
})
fig = px.line(df, x="day", y="orders", title="Orders over time")
fig.show()import pandas as pd
import plotly.express as px
df = pd.DataFrame({
"day": [1, 2, 3, 4, 5],
"orders": [120, 140, 130, 160, 155],
})
fig = px.line(df, x="day", y="orders", title="Orders over time")
fig.show()Hover over any point in the rendered chart and Plotly shows you the exact dayday/ordersorders values — no extra code required.
Saving/exporting
You can export a figure two very different ways:
- HTML — best for interactive sharing (keeps hover, zoom, legend toggling)
- PNG/JPEG/SVG — static image, good for slides or a printed report
fig.write_html("orders.html")fig.write_html("orders.html")fig.write_image("orders.png") # requires the `kaleido` packagefig.write_image("orders.png") # requires the `kaleido` packagePNG/SVG export needs the extra kaleidokaleido dependency installed (pip install -U kaleidopip install -U kaleido); HTML export needs nothing beyond Plotly itself.
flowchart LR A["Tidy DataFrame"] --> B["px.line / px.bar / px.scatter ..."] B --> C["Figure object
(data + layout)"] C --> D{"fig.show() or export?"} D -- "Explore now" --> E["fig.show()
interactive in browser/notebook"] D -- "Share/save" --> F["fig.write_html()
or fig.write_image()"]
Next
Continue to: Interactive Line Charts to build trend charts with markers and multiple series.
🧪 Try It Yourself
Exercise 1 – Build Your First Figure
Exercise 2 – Choose the Right API
Exercise 3 – Export for Sharing
If this helped you, consider buying me a coffee ☕
Buy me a coffeeWas this page helpful?
Let us know how we did
