IPython Magic Commands
Dashboard Lego provides IPython magic commands for ultra-fast dashboard creation and Plotly figure export directly from Jupyter notebooks.
Installation
First, load the extension in your Jupyter notebook:
%load_ext dashboard_lego.ipython_magics
Dashboard Creation
Quick Dashboard from DataFrame
Create dashboards from DataFrame variables with minimal code:
# Load data
import pandas as pd
df = pd.read_csv('sales_data.csv')
# Create dashboard with metrics and charts
%dashboard df
title: "Sales Dashboard"
theme: lux
cards:
- type: metric
metric_spec:
column: Sales
agg: sum
title: "Total Sales"
color: success
- type: metric
metric_spec:
column: Profit
agg: sum
title: "Total Profit"
color: info
- type: chart
plot_type: bar
plot_params: {x: Product, y: Sales}
title: "Sales by Product"
- type: chart
plot_type: line
plot_params: {x: Date, y: Sales}
title: "Sales Trend"
- type: text
content_generator: |
## Summary
Key insights from the data
# Simple single chart dashboard
%dashboard df
cards:
- type: chart
plot_type: scatter
plot_params: {x: Price, y: Sales}
title: "Price vs Sales"
Configuration Keys:
dataframe: Name of DataFrame variable (required)title: Dashboard titletheme: Theme name (uses current preference if not specified)port: Server port (default: 8050)environment: List of variable names to import from IPython namespacecards: List of card specifications with optional controls
Card Types (YAML = kwargs + type):
- Metric: type: metric, metric_spec: {column, agg, title, [color], [dtype]}
- Chart: type: chart, plot_type: str, plot_params: {x, y, [color], [size]}, title: str, optional controls
- Minimal Chart: type: minimal_chart, plot_params: {x, y, ...}, optional plot_type (defaults to scatter), optional controls
- Text: type: text, content_generator: callable (returns str or Component)
- Control Panel: type: control_panel, title: str, controls: [...]
Note
YAML for magics MUST match block constructor kwargs (plus type). No legacy
top-level x/y or column/agg/title. Use metric_spec, plot_params,
and content_generator exactly as in the Python API.
Control Types:
- Dropdown: name, type: dropdown, options, value, col_props
- Slider: name, type: slider, min, max, step, value, marks
- Input: name, type: input, input_type, placeholder, value
Environment Variables:
- Use $variable_name syntax to reference variables from IPython namespace
- Variables must be declared in environment list for security
Available themes: lux, dark, light, cyborg, slate, solar, superhero, minty, flatly, cosmo, cerulean, journal, litera, lumen, pulse, sandstone, simplex, sketchy, spacelab, united, yeti
Cell Magic Dashboard
Create dashboards using YAML configuration in notebook cells with support for controls and environment variables:
%%dashboard_cell
dataframe: df
title: "Sales Dashboard"
theme: lux
environment:
- metric_options
- color_palette
cards:
- type: metric
metric_spec:
column: Sales
agg: sum
title: "Total Sales"
color: success
- type: chart
plot_type: scatter
plot_params: {x: Product, y: Sales}
title: "Sales Analysis"
controls:
- name: metric_selector
type: dropdown
options: $metric_options
value: "Sales"
col_props: {xs: 12, md: 6}
- name: year_slider
type: slider
min: 2020
max: 2024
step: 1
value: 2023
marks: {2020: "2020", 2024: "2024"}
col_props: {xs: 12, md: 6}
- type: text
content_generator: |
## Summary
Key insights from the data:
- Sales increased by 15% this quarter
- Top performing product is Electronics
Understanding Control Bindings
How Controls Wire Together (NEW)
Controls define what gets controlled through state identifiers. Here’s how it works:
1. Control Panel Publishes State
When you define a ControlPanelBlock with controls, each control publishes its value as a state:
ControlPanelBlock(
block_id="filters", # ← This becomes part of state ID
title="Filters",
controls={
"category": Control(...), # ← State ID: "filters-category"
"price": Control(...) # ← State ID: "filters-price"
}
)
State ID formula: {block_id}-{control_name}
Examples:
- filters-category
- filters-price
- session_controls-duration
2. Chart/Metric Subscribes to State
Other blocks subscribe to these state IDs using subscribes_to:
TypedChartBlock(
block_id="sales_chart",
plot_type="bar",
plot_params={"x": "Product", "y": "Sales"},
subscribes_to="filters-category" # ← Subscribe to control panel state
)
3. State Changes Trigger Updates
When user changes control value → state updates → all subscribers re-render
YAML Example: Control Panel with Chart
Here’s a complete example showing how controls bind to charts:
%%dashboard_cell
dataframe: df
title: "Interactive Dashboard"
cards:
# STEP 1: Define control panel
- type: control_panel
title: "Filters"
controls:
- name: category
type: dropdown
options:
- {label: "Electronics", value: "Electronics"}
- {label: "Furniture", value: "Furniture"}
- {label: "Office Supplies", value: "Supplies"}
value: "Electronics"
- name: min_price
type: slider
min: 0
max: 1000
value: 100
# STEP 2: Chart subscribes to control panel states
- type: chart
plot_type: scatter
plot_params: {x: Product, y: Sales}
title: "Sales by Category"
# Subscribe to BOTH controls
subscribes_to:
- "control_panel-category" # Listens to category dropdown
- "control_panel-min_price" # Listens to price slider
What Happens:
Control panel block_id is automatically
control_panelin cell magicControl names become state suffixes:
control_panel-category,control_panel-min_priceChart subscribes to these states
When dropdown changes → state
control_panel-categoryupdates → chart re-rendersWhen slider changes → state
control_panel-min_priceupdates → chart re-renders
Multiple Charts from One Control Panel
%%dashboard_cell
dataframe: df
cards:
# Single control panel
- type: control_panel
title: "Filters"
controls:
- name: region
type: dropdown
options: $region_list
value: "North America"
# Chart 1 subscribes
- type: chart
plot_type: bar
plot_params: {x: Product, y: Revenue}
subscribes_to: "control_panel-region"
# Chart 2 subscribes to SAME control
- type: chart
plot_type: line
plot_params: {x: Month, y: Profit}
subscribes_to: "control_panel-region"
Result: Changing region filter updates both charts
Advanced: Chart with Embedded Controls
Charts can have their own internal controls that don’t affect other blocks:
- type: chart
plot_type: histogram
plot_params: {x: Price}
title: "Price Distribution"
# These are chart-local controls (don't publish state)
controls:
- name: x_col
type: dropdown
options:
- {label: "Price", value: "Price"}
- {label: "Quantity", value: "Quantity"}
value: "Price"
Key Difference: - Control Panel controls → publish state → can control other blocks - Chart embedded controls → private to chart → don’t affect other blocks
Dynamic Marker Size Configuration
For scatter plots with variable marker sizes, you can configure consistent pixel-based sizing that adapts to your data range:
- type: chart
plot_type: scatter_minimal
plot_params: {x: session_length, y: max_idle, size: "{{metric_selector_2}}"}
plot_kwargs:
marker_size_max_px: 42
marker_size_min_px: 8
Configuration:
- marker_size_max_px: Maximum marker size in pixels (largest data point)
- marker_size_min_px: Minimum marker size in pixels (smallest data point)
How it works:
- Uses Plotly’s sizeref formula to normalize marker sizes relative to current data range
- Automatically adapts when filters change the underlying data
- Ensures consistent visual scaling regardless of data distribution
- No modification of underlying DataFrame values
State ID Anatomy
Understanding state ID structure is key:
State ID: "my_filters-category"
└────┬────┘ └──┬──┘
block_id control_name
Subscribe: subscribes_to: "my_filters-category"
Result: Block listens to that control panel's category control
Explicit Parameter Naming with dep_param_name
By default, when a chart subscribes to external controls, the parameter name sent to the datasource is auto-parsed from the control name. For example, subscribing to "quick_card_1-window_step_selector" would send parameter window_step_selector to the datasource.
To explicitly control the parameter name sent to the datasource, use dep_param_name:
%%dashboard_cell
datasource: my_datasource
cards:
# Control panel with slider
- type: control_panel
title: "Select Step"
controls:
- name: window_step_selector
type: slider
min: 1
max: 5
value: 1
# Chart with explicit dep_param_name
- type: chart
plot_type: scatter # YAML x/y are adapted to plot_params internally
x: session_length
y: max_idle
title: "Session Analysis"
subscribes_to:
- state_id: "quick_card_1-window_step_selector"
dep_param_name: "window_step" # ← Explicit datasource param name
What happens:
User changes slider → state
quick_card_1-window_step_selector= 3Chart receives update with
{"quick_card_1-window_step_selector": 3}dep_param_nameremaps this to{"window_step": 3}for datasourceDatasource receives
datasource.get_processed_data({"window_step": 3})
Without dep_param_name (legacy):
subscribes_to:
- "quick_card_1-window_step_selector" # Auto-parses to "window_step_selector"
With dep_param_name (explicit):
subscribes_to:
- state_id: "quick_card_1-window_step_selector"
dep_param_name: "window_step" # Explicitly "window_step"
Use Cases:
Your datasource expects
window_stepbut control is namedwindow_step_selectorMultiple controls map to same datasource parameter
Legacy datasources with specific parameter names
Cleaner API when control names don’t match datasource parameters
Practical Workflow
Step 1: Define control panel with block_id
- type: control_panel
block_id: "filters" # Optional, auto-generated if omitted
title: "Dashboard Filters"
controls:
- name: category
type: dropdown
options: ["A", "B", "C"]
Step 2: Note the state IDs produced
filters-category← This is what other blocks subscribe to
Step 3: Charts subscribe
- type: chart
plot_type: bar
plot_params: {x: Product, y: Sales}
subscribes_to: "filters-category" # Now this chart listens to control changes
Result: User changes dropdown → chart updates automatically
Theme Management
Set default theme for future dashboards:
# Set theme
%dashboard_theme cyborg
# View current theme and available options
%dashboard_theme
Plotly Export
Export Figures to Files
Export Plotly figures from dashboard blocks:
# Export as HTML with custom title
%plotly_export chart_block
format: html
output: sales_chart.html
title: "Sales Analysis"
# Export as PNG image with custom dimensions
%plotly_export chart_block
format: png
output: chart.png
width: 1000
height: 800
# Export as JSON
%plotly_export chart_block
format: json
output: data.json
# Export with parameters for interactive controls
%plotly_export histogram
format: html
output: distribution.html
params:
x_col: "Price"
group_by: "Category"
Configuration Keys:
block: Name of dashboard block variable (required)format: Export format (html, png, json, svg)output: Output file path (required)title: Figure title (for HTML)width: Figure width (for images)height: Figure height (for images)params: JSON parameters for block.get_figure()
Display in Notebook
Display figures inline in Jupyter notebooks:
# Show figure with custom size and title
%plotly_show chart_block
title: "Interactive Chart"
width: 900
height: 600
# Show with parameters for interactive controls
%plotly_show histogram
params:
x_col: "Price"
group_by: "Category"
Batch Export
Export multiple figures using cell magic:
%%plotly_export
exports:
- block: sales_chart
format: html
output: sales_report.html
title: "Sales Analysis"
- block: profit_chart
format: png
output: profit_analysis.png
width: 1200
height: 800
Examples
Complete Workflow Example with Controls:
# Load extension
%load_ext dashboard_lego.ipython_magics
# Load data and prepare variables
import pandas as pd
df = pd.read_csv('data.csv')
# Prepare environment variables
metric_options = [
{"label": "Sales", "value": "sales"},
{"label": "Profit", "value": "profit"},
{"label": "Revenue", "value": "revenue"}
]
color_palette = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728"]
# Create dashboard with controls
%%dashboard_cell
dataframe: df
title: "Interactive Sales Dashboard"
theme: lux
environment:
- metric_options
- color_palette
cards:
- type: metric
metric_spec:
column: Sales
agg: sum
title: "Total Sales"
color: success
- type: chart
plot_type: scatter
plot_params: {x: Product, y: Sales}
title: "Sales Analysis"
controls:
- name: metric_selector
type: dropdown
options: $metric_options
value: "sales"
col_props: {xs: 12, md: 6}
- name: year_slider
type: slider
min: 2020
max: 2024
step: 1
value: 2023
marks: {2020: "2020", 2024: "2024"}
col_props: {xs: 12, md: 6}
# Export charts
%plotly_export sales_chart
format: html
output: dashboard_export.html
title: "Sales Dashboard Export"
# Display in notebook
%plotly_show sales_chart
title: "Interactive Sales Chart"
Common Patterns
Quick Analysis with Controls:
# Prepare environment
metric_options = [{"label": "Sales", "value": "sales"}, {"label": "Profit", "value": "profit"}]
%%dashboard_cell
dataframe: df
environment:
- metric_options
cards:
- type: metric
metric_spec:
column: col1
agg: mean
title: "Average"
- type: chart
plot_type: histogram
plot_params: {x: col1}
title: "Distribution"
controls:
- name: metric_selector
type: dropdown
options: $metric_options
value: "sales"
Interactive Parameter Exploration:
# Hyperparameter playground example
session_params = {
'session_length': [10, 15, 20, 25, 30],
'max_idle': [600, 900, 1800, 3600, 7200],
'window_step': [3, 5, 7, 10]
}
%%dashboard_cell
dataframe: session_hp_datasource
title: "Session Hyperparameters Playground"
environment:
- session_params
- metric_options
cards:
- type: chart
plot_type: scatter
plot_params: {x: session_length, y: max_idle}
title: "Session Length vs Max Idle"
controls:
- name: metric_selector
type: dropdown
options: $metric_options
value: "n_sessions"
- name: window_step_slider
type: slider
min: 3
max: 10
step: 1
value: 5
Report Generation:
%plotly_export analysis_chart
format: html
output: report.html
title: "Analysis Results"
%plotly_export summary_chart
format: png
output: summary.png
width: 800
height: 400
Interactive Exploration:
%plotly_show chart
title: "Interactive View"
# Now you can interact with the chart in the notebook
Troubleshooting
Block not found: Ensure the block variable exists in the notebook namespace
Export fails: Check file permissions and disk space
Display issues: Ensure plotly is properly installed and configured for Jupyter
Theme not applied: Use %dashboard_theme to set default theme before creating dashboards
Error Messages
❌ Error: Block variable 'X' not found- Variable doesn’t exist in namespace❌ Error: Block 'X' does not support figure export- Block doesn’t haveget_figure()method❌ Error: --output/-o is required- Output file path not specified❌ Error: Environment variable 'X' not found- Variable not declared in environment list❌ Error: Invalid YAML format- YAML syntax error in cell configuration❌ Error: Control 'X': unknown type 'Y'- Unsupported control type (use dropdown, slider, input)❌ Error: Variable '$X' not found in environment- Referenced variable not in environment list