Skip to main content

Visualization Guide

FastSPA provides interactive visualization tools for exploring supply chain analysis results using Plotly. These visualizations help identify bottlenecks, hotspots, and supply chain structure at a glance.

Overview​

The visualization module provides three main chart types:

  • Icicle Plots: Hierarchical rectangles showing supply chain depth and contribution magnitude
  • Sunburst Charts: Radial hierarchical view of supply chains
  • Sector Contribution Charts: Bar charts showing top contributing sectors

Installation​

Visualization features require Plotly:

pip install plotly

Icicle Plot​

The icicle plot is the primary visualization for supply chain decomposition. Each rectangle represents a supply chain link, with:

  • Width/Area: Relative contribution to total intensity
  • Color Intensity: Magnitude of the intensity value
  • Hierarchy: Supply chain depth from target sector to suppliers

Basic Usage​

from fastspa import SPA, icicle_plot

# Run analysis
spa = SPA(A_matrix, emissions, sectors=sector_names)
paths = spa.analyze(sector=0, depth=6, threshold=0.001)

# Generate interactive plot
fig = icicle_plot(paths, output_html="supply_chain.html")

Parameters​

icicle_plot(
paths_dict, # PathCollection or dict of PathCollections
output_html=None, # Path to save HTML file (None = return Figure)
title="...", # Plot title
colorscale="Plasma", # Plotly colorscale name
include_stage_0=True # Include direct requirements
)

Example: Multi-Satellite Analysis​

# Analyze multiple satellites
result = spa.analyze(sector=0, depth=6) # Returns SPAResult with all satellites

# Visualize all satellites together
icicle_plot(
result,
output_html="multi_satellite.html",
title="Multi-Satellite Supply Chain Analysis"
)

Sunburst Plot​

Sunburst charts provide a circular/radial view of the same hierarchy, useful for exploring specific branches by clicking.

from fastspa import sunburst_plot

paths = spa.analyze(sector=0, depth=6)

sunburst_plot(
paths,
output_html="sunburst.html",
max_depth=4 # Limit depth for clarity
)

Parameters​

sunburst_plot(
paths_dict, # PathCollection or dict of PathCollections
output_html=None, # Path to save HTML
title="...", # Plot title
colorscale="Viridis", # Color scheme
max_depth=None # Maximum depth to display
)

Sector Contribution Charts​

Bar charts showing which sectors contribute most to the target sector's total intensity.

from fastspa import sector_contribution_chart

paths = spa.analyze(sector=0, depth=6)

sector_contribution_chart(
paths,
output_html="hotspots.html",
top_n=15 # Show top 15 sectors
)

This aggregates contributions by the leaf/upstream sector where the intensity occurs.

Working with Results​

Analyzing Single Sectors​

paths = spa.analyze(sector=42, depth=8)

# Create all three visualizations
icicle_plot(paths, output_html="icicle.html")
sunburst_plot(paths, output_html="sunburst.html")
sector_contribution_chart(paths, output_html="chart.html")

Comparing Multiple Sectors​

# Analyze multiple target sectors
results = spa.analyze_many(
sectors=[0, 5, 10, 15],
depth=6
)

# Each result can be visualized
for sector_id, paths in results.items():
icicle_plot(
paths,
output_html=f"icicle_sector_{sector_id}.html",
title=f"Supply Chain: Sector {sector_id}"
)

System-Wide Analysis​

# Use system_wide mode for total requirements (including indirect flows)
spa = SPA(A_matrix, emissions, sectors=names, mode="system_wide")
paths = spa.analyze(sector=0, depth=6)

icicle_plot(
paths,
output_html="total_requirements.html",
title="Total (Direct + Indirect) Supply Chain Requirements"
)

Customization​

Color Scales​

Plotly provides many built-in color scales. Common options:

  • "Plasma" (default) - Perceptually uniform
  • "Viridis" - Colorblind-friendly
  • "Turbo" - High contrast
  • "Blues" - Monochromatic
  • "RdBu" - Diverging (red-blue)
icicle_plot(paths, output_html="plot.html", colorscale="Viridis")

Custom Titles​

icicle_plot(
paths,
output_html="plot.html",
title="Greenhouse Gas Emissions in Supply Chain"
)

Export Formats​

All functions return Plotly Figure objects:

# Save to HTML (interactive)
fig = icicle_plot(paths, output_html="plot.html")

# Return Figure (for further customization)
fig = icicle_plot(paths)

# Export to image (requires kaleido)
fig.write_image("plot.png")
fig.write_image("plot.pdf")

Performance Notes​

  • Icicle plots handle 100-500+ paths efficiently
  • Sunburst plots can be slower with deep hierarchies (limit with max_depth)
  • HTML files are self-contained and can be shared/embedded

Interpretation Guide​

Reading an Icicle Plot​

  1. Top Level: All supply chains combined
  2. Second Level: Breakdown by satellite (if multiple)
  3. Deeper Levels: Supply chain stages and sectors
  4. Rectangle Size: Larger = higher contribution
  5. Color: Darker/brighter = higher intensity value

Identifying Hotspots​

  • Look for large rectangles - these are major contributors
  • Darker colors indicate high intensity values
  • Multiple large siblings often indicate diversified supply chains

Exploring Branching Patterns​

  • Many branches = complex, multi-supplier chains
  • Few branches = focused, concentrated supply chains
  • Deep hierarchies = long supply chains with multiple tiers

Troubleshooting​

ImportError: plotly not found​

Install plotly:

pip install plotly

Plot looks empty or has missing sectors​

  • Check that paths were found: len(paths.paths) > 0
  • Reduce threshold: threshold=0.001 instead of default
  • Increase depth: depth=8 or higher

HTML file is very large​

This is normal for many paths. You can:

  • Reduce the number of paths: use max_paths parameter in analyze()
  • Increase threshold: use higher threshold value
  • Limit depth: use smaller depth value

See Also​