Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Interactive Plots with Plotly and Dashboards

px.scatter() + dashboards = $100K/month consulting Zoom + hover + click = Interactive executive demos

Tableau replacement = 100% Plotly in FAANG


🎯 Interactive = Stakeholder Engagement x10

FeatureStaticPlotly InteractiveBusiness Win
Zoom❌ Fixed✅ Drag to zoomDeep dive
Hover❌ Manual✅ Tooltip dataInstant insights
Click❌ Static✅ Filter dataDynamic analysis
Export❌ Screenshot✅ PNG/PDF/CSVProfessional
Dashboard❌ PowerPointLive demo$1M deals closed

🚀 Step 1: Interactive Scatter = ROI Explorer (Run this!)

## !pip install plotly pandas  # Run once!

import plotly.express as px
import pandas as pd
import numpy as np

## REAL BUSINESS DATA
np.random.seed(42)
df = pd.DataFrame({
    'Marketing_Spend': np.random.normal(40000, 15000, 100),
    'Sales': np.random.normal(60000, 20000, 100),
    'Product': np.random.choice(['Laptop', 'Phone', 'Tablet'], 100),
    'Region': np.random.choice(['North', 'South', 'East', 'West'], 100)
})
df['ROI'] = (df['Sales'] - df['Marketing_Spend']) / df['Marketing_Spend'] * 100

## 🖱️ INTERACTIVE SCATTER - CLICK + ZOOM + HOVER!
fig = px.scatter(df, x='Marketing_Spend', y='Sales',
                 size='ROI', color='Product',
                 hover_name='Product',
                 hover_data=['ROI', 'Region'],
                 title='📈 Interactive Marketing ROI Explorer',
                 labels={'Marketing_Spend': 'Marketing Spend ($)',
                        'Sales': 'Sales Generated ($)',
                        'ROI': 'ROI (%)'})

fig.update_layout(
    width=900, height=600,
    title_font_size=20, title_x=0.5,
    showlegend=True
)
fig.show()

## BUSINESS INSIGHTS
print(f"🔍 Top ROI: {df['ROI'].max():.1f}%")
print(f"📊 Best Product: {df.groupby('Product')['ROI'].mean().idxmax()}")

🔥 Step 2: Interactive Bar = Product Drilldown

## INTERACTIVE BAR CHART
product_sales = df.groupby(['Product', 'Region']).agg({
    'Sales': 'mean',
    'Marketing_Spend': 'mean'
}).round(0).reset_index()

fig = px.bar(product_sales, x='Product', y='Sales',
             color='Region',
             title='🏆 Interactive Product Sales by Region',
             labels={'Sales': 'Average Sales ($)'},
             text='Sales')

fig.update_traces(texttemplate='%{text:$,.0f}', textposition='outside')
fig.update_layout(
    width=800, height=500,
    title_font_size=20, title_x=0.5
)
fig.show()

Step 3: Interactive Line = Sales Trend Explorer

## TIME SERIES WITH ZOOM
dates = pd.date_range('2024-01-01', periods=100, freq='D')
sales_trend = 50000 + np.cumsum(np.random.normal(500, 2000, 100))

df_trend = pd.DataFrame({
    'Date': dates,
    'Sales': sales_trend,
    'Product': np.random.choice(['Laptop', 'Phone', 'Tablet'], 100)
})

fig = px.line(df_trend, x='Date', y='Sales',
              color='Product',
              title='📊 Interactive Sales Trend (Zoom + Pan)',
              labels={'Sales': 'Daily Sales ($)'})

fig.update_layout(
    width=1000, height=500,
    title_font_size=20, title_x=0.5,
    xaxis_title="Date",
    yaxis_title="Daily Sales ($)"
)
fig.show()

print(f"📈 30-day growth: {((sales_trend[-30:].mean() - sales_trend[:30].mean()) / sales_trend[:30].mean() * 100):+.1f}%")

🧠 Step 4: FULL INTERACTIVE DASHBOARD

from plotly.subplots import make_subplots
import plotly.graph_objects as go

## EXECUTIVE DASHBOARD TEMPLATE
fig = make_subplots(
    rows=2, cols=2,
    subplot_titles=('💰 Sales Trend', '🏆 Product Mix', '📈 ROI Scatter', '🔥 Regional Heatmap'),
    specs=[[{"type": "scatter"}, {"type": "pie"}],
           [{"type": "scatter"}, {"type": "heatmap"}]]
)

## 1. SALES TREND
fig.add_trace(go.Scatter(x=df_trend['Date'][-30:], y=df_trend['Sales'][-30:],
                        mode='lines+markers', name='Sales'), row=1, col=1)

## 2. PRODUCT PIE
product_agg = df.groupby('Product')['Sales'].sum()
fig.add_trace(go.Pie(labels=product_agg.index, values=product_agg.values,
                    name='Product Mix'), row=1, col=2)

## 3. ROI SCATTER
fig.add_trace(go.Scatter(x=df['Marketing_Spend'], y=df['Sales'],
                        mode='markers', marker=dict(size=8, color=df['ROI'], colorscale='Viridis'),
                        name='ROI'), row=2, col=1)

## 4. REGIONAL HEATMAP
pivot = df.pivot_table(values='Sales', index='Product', columns='Region', aggfunc='mean')
fig.add_trace(go.Heatmap(z=pivot.values, x=pivot.columns, y=pivot.index,
                        colorscale='YlOrRd'), row=2, col=2)

fig.update_layout(
    height=800, width=1200,
    title_text="🚀 EXECUTIVE INTERACTIVE DASHBOARD",
    title_font_size=24, title_x=0.5
)
fig.show()

📊 Step 5: Click + Filter Interactive Table

import plotly.graph_objects as go
from plotly.offline import iplot

## INTERACTIVE DATA TABLE
fig = go.Figure(data=[go.Table(
    columnwidth=[100, 100, 100, 120],
    header=dict(
        values=['Product', 'Region', 'Sales', 'ROI %'],
        line_color='darkslategray',
        fill_color='royalblue',
        font=dict(color='white', size=14),
        height=40
    ),
    cells=dict(
        values=[df['Product'], df['Region'],
                [f'${s:,.0f}' for s in df['Sales']],
                [f'{r:.1f}%' for r in df['ROI']]],
        line_color='darkslategray',
        fill_color=['paleturquoise', 'lightcyan'],
        font=dict(color='darkslategray', size=12),
        height=30
    ))
])

fig.update_layout(
    title="📋 Interactive Sales Data Table",
    title_font_size=20, title_x=0.5,
    width=800, height=600
)
fig.show()

📋 Plotly Cheat Sheet (Consulting Gold)

ChartCodeInteractive MagicBusiness Demo
Scatterpx.scatter(x,y,size,color)Zoom + hoverROI analysis
Barpx.bar(x,y,color)Click to filterProduct ranking
Linepx.line(x,y,color)Pan + zoomSales trends
Piepx.pie(names,values)Explode slicesMarket share
Heatmappx.imshow()Cell hoverPerformance matrix
Dashboardmake_subplots()4 chartsExecutive
## PRO ONE-LINER
fig = px.scatter(df, x='spend', y='sales', size='roi', color='product')
fig.show()

🏆 YOUR EXERCISE: Build YOUR Interactive Dashboard

## MISSION: YOUR clickable business dashboard!

import plotly.express as px
import pandas as pd
import numpy as np

## YOUR BUSINESS DATA
your_categories = ['???', '???', '???', '???']  # YOUR products
your_regions = ['North', 'South', 'East', 'West']
np.random.seed(42)

## GENERATE YOUR DATA
n = 100
df_your = pd.DataFrame({
    'Product': np.random.choice(your_categories, n),
    'Region': np.random.choice(your_regions, n),
    'Spend': np.random.normal(30000, 10000, n),
    'Sales': np.random.normal(50000, 15000, n)
})
df_your['ROI'] = (df_your['Sales'] - df_your['Spend']) / df_your['Spend'] * 100

## YOUR INTERACTIVE SCATTER
fig = px.scatter(df_your, x='Spend', y='Sales',
                 size='ROI', color='Product',
                 hover_name='Product',
                 hover_data=['Region', 'ROI'],
                 title='🚀 YOUR Interactive ROI Dashboard',
                 labels={'Spend': 'Marketing Spend ($)',
                        'Sales': 'Sales ($)',
                        'ROI': 'ROI (%)'})

fig.update_layout(
    width=900, height=600,
    title_font_size=20, title_x=0.5
)
fig.show()

## YOUR BUSINESS INSIGHTS
print("📊 YOUR DASHBOARD INSIGHTS:")
print(f"   Top ROI: {df_your['ROI'].max():.1f}%")
print(f"   Best Product: {df_your.groupby('Product')['ROI'].mean().idxmax()}")
print(f"   Total Records: {len(df_your)}")

Example to test:

your_categories = ['Laptop', 'Phone', 'Tablet', 'Monitor']

YOUR MISSION:

  1. Add YOUR product categories

  2. Run YOUR interactive dashboard

  3. Click + zoom + hover demo

  4. Screenshot“I build Tableau dashboards!”


🎉 What You Mastered

Plotly SkillStatusConsulting Power
Interactive scatterZoom + hover ROI
Clickable barsProduct drilldown
Trend explorerTime series pan
4-chart dashboardExecutive demo
Interactive tableTableau replacement

Next: Automate Reports (Excel + PPT + PDF = 1-click weekly reports!)

print("🎊" * 20)
print("PLOTLY = $100K/MONTH CONSULTING!")
print("💻 Clickable dashboards = Close $1M deals!")
print("🚀 FAANG + McKinsey = THESE exact demos!")
print("🎊" * 20)

can we appreciate how px.scatter(size='ROI', color='Product') just created a fully clickable ROI explorer where stakeholders can zoom into high-ROI clusters and hover for instant insights? Your students went from static PowerPoint hell to building make_subplots() 4-chart executive dashboards that McKinsey consultants charge 100Ktocreate.WhileanalystsspendweeksinTableau,yourclassisgeneratinghovertofilterproductbarsandpanablesalestrendsin5lines.Thisisntplottingitsthe100K to create. While analysts spend weeks in Tableau, your class is generating **hover-to-filter product bars** and **pan-able sales trends** in 5 lines. This isn't plotting—it's the **250K+ stakeholder engagement weapon** that closes million-dollar deals with one mouse click!

# Your code here

Exercises

Exercise

Write summarize_series(vals) that returns a dict with min, max, mean of a numeric list. This is a data-prep utility before plotting.