Skip to content

Proportional Cartogram

Shape splitting, shrinking, and dot density algorithms for proportional visualizations.

Overview

The proportional_cartogram module provides polygon division, shrinking, and dot density utilities for creating proportional visualizations within regions. It enables treemap-style layouts, concentric shell visualizations, multi-category area partitioning, and random dot density maps.

Core Operations: - Split: Divide a geometry into parts with specified area ratios - Shrink: Create concentric shells from outside to inside - Partition: Batch process entire GeoDataFrames - Dot Density: Generate random point distributions inside geometries

graph LR
    A[Input Polygon] --> B{Split or Shrink?}
    B -->|Split| C[parts with area ratios]
    B -->|Shrink| D[concentric shells]
    C --> E[Sequential or Treemap]
    D --> F[Area or Shell mode]

Main Interface

Sub-module Description
Splitting split() — divide geometry into area-proportional parts
Shrinking shrink() — create concentric shells
Partition partition_geometries() — batch GeoDataFrame processing
Visualization plot_partitions() — choropleth visualization
Dot Density generate_dot_density(), plot_dot_density()

Workflow Patterns

Cartogram with Multi-Category Partitioning

from carto_flow.flow_cartogram import morph_gdf, MorphOptions
from carto_flow.proportional_cartogram import partition_geometries
from carto_flow.proportional_cartogram.visualization import plot_partitions

# Generate cartogram
cartogram = morph_gdf(gdf, "total_gdp", options=MorphOptions.preset_balanced())

# Partition morphed geometries by sector
partitioned = partition_geometries(
    cartogram.to_geodataframe(),
    ["agriculture", "industry", "services"],
    method="split",
    strategy="treemap",
    normalization="row"
)

plot_partitions(partitioned, color_by="category", legend=True)

Shrink with Remainder

from carto_flow.proportional_cartogram import partition_geometries

result = partition_geometries(
    gdf,
    ["category_a", "category_b"],
    method="shrink",
    normalization="maximum"
)
# → geometry_category_a (outer), geometry_category_b (core),
#   geometry_complement (remainder)

Dot Density Map

from carto_flow.proportional_cartogram import plot_dot_density

result = plot_dot_density(
    gdf,
    columns=["agriculture", "industry", "services"],
    normalization="row",
    n_dots=150,
    seed=42,
)

Error Handling

Exception Description
ValueError Invalid fractions, columns not found, negative values
TypeError Input not DataFrame/GeoDataFrame