diff --git a/sprint-9-10-figure-factory-pattern.-.md b/sprint-9-10-figure-factory-pattern.-.md new file mode 100644 index 0000000..95e64cf --- /dev/null +++ b/sprint-9-10-figure-factory-pattern.-.md @@ -0,0 +1,55 @@ +# Sprint 9-10 - Figure Factory Pattern for Reusable Charts + +**Date**: 2026-01-17 +**Tags**: plotly, dash, design-patterns, python, visualization, reusability, code-organization + +--- + +## Context +Creating multiple chart types across 5 dashboard tabs, with consistent styling and behavior needed across all visualizations. + +## Problem +Without a standardized approach, each callback would create figures inline with: +- Duplicated styling code (colors, fonts, backgrounds) +- Inconsistent hover templates +- Hard-to-maintain figure creation logic +- No reuse between tabs + +## Solution +Created a `figures/` module with factory functions: + +``` +figures/ +├── __init__.py # Exports all factories +├── choropleth.py # Map visualizations +├── bar_charts.py # ranking_bar, stacked_bar, horizontal_bar +├── scatter.py # scatter_figure, bubble_chart +├── radar.py # radar_figure, comparison_radar +└── demographics.py # age_pyramid, donut_chart +``` + +Factory pattern benefits: +1. **Consistent styling** - dark theme applied once +2. **Type-safe interfaces** - clear parameters for each chart type +3. **Easy testing** - factories can be unit tested with sample data +4. **Reusability** - same factory used across multiple tabs + +Example factory signature: +```python +def create_ranking_bar( + data: list[dict], + name_column: str, + value_column: str, + title: str = "", + top_n: int = 5, + bottom_n: int = 5, + top_color: str = "#4CAF50", + bottom_color: str = "#F44336", +) -> go.Figure: +``` + +## Prevention +- **Create factories early** - before implementing callbacks +- **Design generic interfaces** - factories should work with any data matching the schema +- **Apply styling in one place** - use constants for colors, fonts +- **Test factories independently** - with synthetic data before integration