Building Dashboards With Plotly and Dash
SkillVeris Team
Data Science Team

Dash is a Python framework for building interactive web dashboards using Plotly charts, without writing JavaScript.
In this guide, you'll learn:
- A Dash app has two parts: a layout describing the components and callbacks that make them interactive.
- Plotly Express creates rich, interactive figures in a single line, which Dash embeds via the dcc.Graph component.
- Callbacks link inputs like dropdowns and sliders to outputs like charts, updating them reactively.
- Dash runs on Flask, so it deploys anywhere Python web apps run, from a laptop to the cloud.
1What Is Dash?
Dash is an open-source Python framework for building interactive, web-based dashboards without writing any JavaScript. Built by the makers of Plotly, it lets data scientists turn analysis scripts into shareable web apps using only Python, HTML-like components, and Plotly charts.
It is popular because it bridges a common gap. Analysts can produce great charts in a notebook but struggle to share them interactively. Dash wraps those charts in a live web application with dropdowns, sliders, and filters that update in real time.
2Plotly: The Charting Layer
Dash renders charts built with Plotly, so it helps to understand Plotly first. Plotly Express is its high-level interface, creating interactive figures with zoom, hover tooltips, and pan built in from a single function call.
A Quick Chart
This produces an interactive scatter plot you can zoom and hover over, all from one line.
import plotly.express as px
df = px.data.gapminder().query("year == 2007")
fig = px.scatter(df, x='gdpPercap', y='lifeExp',
size='pop', color='continent', hover_name='country')
fig.show()3The Structure of a Dash App
Every Dash app has two core pieces. The layout defines what the user sees a tree of components like headings, dropdowns, and graphs. The callbacks define how the app reacts when a user interacts with those components.
- app = Dash(__name__): creates the application instance.
- app.layout: a tree of components describing the page structure.
- dcc components: interactive elements like Graph, Dropdown, and Slider.
- html components: static structure like Div, H1, and P.
- callbacks: functions that connect inputs to outputs reactively.
🔑Two Halves
Think layout for what it looks like and callbacks for how it behaves. Keeping these mentally separate makes Dash apps much easier to build and debug.
4Your First Dashboard
A minimal Dash app displays a dropdown and a chart that updates when the selection changes. Here is the layout and a callback wired together.
app.py
The layout places a dropdown above a graph. The callback listens to the dropdown and returns an updated figure.
from dash import Dash, dcc, html, Input, Output
import plotly.express as px
df = px.data.gapminder()
app = Dash(__name__)
app.layout = html.Div([
dcc.Dropdown(df.continent.unique(), 'Asia', id='continent'),
dcc.Graph(id='chart')
])The Callback
The decorator links the dropdown's value to the graph's figure. Whenever the user picks a continent, Dash reruns the function and refreshes the chart.
@app.callback(Output('chart', 'figure'), Input('continent', 'value'))
def update(continent):
d = df[df.continent == continent]
return px.line(d, x='year', y='lifeExp', color='country')
if __name__ == '__main__':
app.run(debug=True)5How Callbacks Work
Callbacks are the reactive engine of Dash. Each callback declares one or more Inputs the components it watches and one or more Outputs the components it updates. When any input changes, Dash automatically reruns the function and pushes the result to the output.
This reactive model means you never manually refresh the page or track state by hand. You describe the relationship once inputs to outputs and Dash keeps everything in sync. You can chain callbacks so one output feeds another, building complex interactivity from simple pieces.
6Deploying Your Dashboard
Because Dash runs on top of Flask, it deploys anywhere a standard Python web app runs. For production you swap the development server for a WSGI server like Gunicorn and put it behind a reverse proxy.
- Expose the Flask server: server = app.server for Gunicorn to find.
- Run with gunicorn app:server for a production-grade server.
- Containerize with Docker for reproducible deployment.
- Host on any cloud platform that runs Python web apps.
💡Turn Off Debug Mode
Always set debug=False in production. Debug mode exposes an interactive traceback that can leak information about your code and environment.
7Best Practices
A few habits keep Dash apps fast, readable, and maintainable as they grow.
- Keep callbacks lightweight; move heavy data loading outside the callback or cache it.
- Cache expensive queries with a library like Flask-Caching to avoid recomputing on every interaction.
- Separate data logic from layout code so each stays readable.
- Load large datasets once at startup rather than inside a callback.
- Give every component a clear id you will reference it in callbacks.
8Key Takeaways
The essentials of building dashboards with Plotly and Dash are these.
- Dash builds interactive dashboards in pure Python, no JavaScript required.
- An app is a layout of components plus callbacks that make them interactive.
- Plotly Express creates interactive charts embedded via dcc.Graph.
- Callbacks link inputs to outputs and update reactively on change.
- Deploy on Gunicorn with debug off, and cache expensive computations.
9Frequently Asked Questions
Q: Do I need to know JavaScript to use Dash? A: No. Dash is designed so you can build fully interactive web dashboards using only Python. It generates the underlying HTML and JavaScript for you, though you can add custom JavaScript later if you need advanced behavior.
Q: What is the difference between Plotly and Dash? A: Plotly is the charting library that creates interactive figures, while Dash is the framework that turns those figures into a complete web application with interactivity, filters, and layout. You use Plotly to make charts and Dash to build the app around them.
Q: How do callbacks make a dashboard interactive? A: A callback watches one or more input components, such as a dropdown, and updates output components, such as a chart, whenever the inputs change. Dash reruns the callback automatically and refreshes the output, so the app stays reactive without manual page reloads.
Q: Can I deploy a Dash app to production? A: Yes. Dash runs on Flask, so you can deploy it with a production server like Gunicorn, containerize it with Docker, and host it on any cloud platform that supports Python web apps. Remember to disable debug mode before going live.
Related Reading
Get The Print Version
Download a PDF of this article for offline reading.
About the Publisher
SkillVeris Team
Data Science Team
Our data team shares real-world analytics, ML, and SQL insights grounded in industry practice.
View all postsRelated Posts
Never miss an update
Get the latest tutorials and guides delivered to your inbox.
No spam. Unsubscribe anytime.