Skip to main content

streamlit-hexviz 🗺️

Simple H3, S2, and A5 map visualisations for Streamlit.

Demo PyPI version

import streamlit_hexviz as shv

# One line: bin points → hexagons → colour-coded choropleth
shv.h3_map(df, lat="lat", lon="lon", weight="sales")

# Continuous heatmap
shv.h3_heatmap(df, lat="lat", lon="lon")

# Pre-indexed data (from a DB query)
shv.h3_choropleth(df, h3_col="h3_index", value_col="count")

# S2 grid
shv.s2_map(df, lat="lat", lon="lon", level=12)

# A5 grid (pentagonal cells, optional extra)
shv.a5_map(df, lat="lat", lon="lon", weight="sales")

Sidebar controls for resolution, colour scale, opacity, and 3-D extrusion are injected automatically — no boilerplate required.

Screenshots

H3 hexagon choropleth (simple app)

H3 hexagon choropleth

S2 choropleth

S2 choropleth


Installation

pip install streamlit-hexviz
# S2 support (optional):
pip install "streamlit-hexviz[s2]"
# A5 support (optinoal):
pip install "streamlit-hexviz[a5]"

# A5 & S2 support (optional):
pip install "streamlit-hexviz[s2,a5]"

API reference

shv.h3_map(df, ...) — choropleth from raw points

Parameter Type Default Description
df DataFrame required Input data with coordinate columns
lat, lon str "lat", "lon" Coordinate column names
resolution int 7 H3 resolution (0-15)
weight str | None None Column to aggregate; None = count points
agg str "sum" "sum", "mean", "count", "max", "min"
transform str "linear" "linear", "log", "quantile"
colour_scale str "viridis" viridis, plasma, heat, blues, reds, greens
alpha int 200 Fill opacity 0-255
extruded bool False 3-D bar chart mode
elevation_scale float 100 Vertical exaggeration (extruded only)
map_style str "dark" "dark", "light", "road", "satellite"
tooltip str | None None HTML tooltip; use {value}, {h3_index}
use_sidebar_controls bool True Inject resolution/colour controls into sidebar
key str | None None Streamlit widget key prefix

Returns: aggregated DataFrame with columns h3_index, value, lat, lon, fill_color, geometry.


shv.h3_heatmap(df, ...) — continuous density heatmap

Same coordinate params. Extra params: radius_pixels (default 40).


shv.h3_choropleth(df, ...) — pre-indexed data

Parameter Default Description
h3_col "h3_index" Column containing H3 cell tokens
value_col "value" Column to visualise

shv.s2_map(df, ...) — S2 grid (optional extra: pip install "streamlit-hexviz[s2]")

Same as h3_map but uses level (0-30) instead of resolution.


shv.a5_map(df, ...) — A5 grid (optional extra: pip install "streamlit-hexviz[a5]")

Bins points into pentagonal A5 cells. Same shape as h3_map, with an a5_index column and its own resolution range.

Parameter Type Default Description
df DataFrame required Input data with coordinate columns
lat, lon str "lat", "lon" Coordinate column names
resolution int 11 A5 resolution (0-30)
weight str | None None Column to aggregate; None = count points
agg str "sum" "sum", "mean", "count", "max", "min"
transform str "linear" "linear", "log", "quantile"
colour_scale str "viridis" viridis, plasma, heat, blues, reds, greens
alpha int 200 Fill opacity 0-255
extruded bool False 3-D bar chart mode
elevation_scale float 100 Vertical exaggeration (extruded only)
map_style str "dark" "dark", "light", "road", "satellite"
tooltip str | None None HTML tooltip; use {value}, {a5_index}
use_sidebar_controls bool True Inject resolution/colour controls into sidebar
key str | None None Streamlit widget key prefix

Returns: aggregated DataFrame with columns a5_index, value, lat, lon, fill_color.


shv.a5_choropleth(df, ...) — pre-indexed A5 data

Parameter Default Description
a5_col "a5_index" Column containing A5 cell IDs
a5_index_type "hex" "hex" (hex string tokens) or "int" (raw 64-bit ints)
value_col "value" Column to visualise

A5 cell IDs are 64-bit integers, which exceed JavaScript's safe integer range — a5_map/a5_choropleth always store and pass a5_index as a hex string internally (via a5.u64_to_hex) to avoid precision loss when pydeck serialises the DataFrame to JSON for the browser. Pass a5_index_type="int" to a5_choropleth if your source column has raw ints; they'll be converted automatically.


Transforms

Name Best for
linear Uniformly distributed values
log Heavy-tailed count distributions
quantile Any distribution; highlights relative rank

H3 resolution guide

Resolution Avg area Typical use
5 ~252 km² Country-level
7 ~5.2 km² City-level
9 ~0.1 km² Neighbourhood
11 ~0.001 km² Block-level

A5 resolution guide

A5 pentagons roughly quarter in area per resolution step (vs. H3's ~7x factor), so equivalent detail sits at a higher resolution number. Figures below are computed directly via a5.cell_area(resolution).

Resolution Avg area Typical use
3 ~531,000 km² Subcontinent-level
8 ~519 km² Country/region-level
11 ~8 km² City-level (a5_map default)
15 ~0.03 km² Neighbourhood
20 ~31 m² Parcel/building-level

Running the demo

Visualization the basic maps

pip install streamlit h3 pydeck numpy pandas
streamlit run examples/app_simple.py

More interactive app demo

pip install streamlit[s2,a5] h3 pydeck numpy pandas
streamlit run examples/demo_app.py

Contributing

PRs welcome! See CONTRIBUTING.md.


License

MIT

Release files for streamlit-hexviz 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for streamlit-hexviz 0.2.0
File Size Uploaded
streamlit_hexviz-0.2.0.tar.gz 14.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for streamlit-hexviz 0.2.0
File Interpreter ABI Platform
streamlit_hexviz-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 32.2 kB

Release files / streamlit_hexviz-0.2.0.tar.gz

Download URL streamlit_hexviz-0.2.0.tar.gz
Size 14.9 kB
Tags Source
SHA-256 checksum
How to use checksums
2ff54f386c084246232ec45bd8087bbd9f9e86488dd964e10766fa0fef61f8c5
BLAKE2b-256 checksum
How to use checksums
be3247933d27ceb99b6d1612307bc32d5327ea1c867d12f1086df494b12025b2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.3

Release files / streamlit_hexviz-0.2.0-py3-none-any.whl

Download URL streamlit_hexviz-0.2.0-py3-none-any.whl
Size 17.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
734f760f29c477f7e97b159206e12a647692323e8523c1e0aced261957324c9c
BLAKE2b-256 checksum
How to use checksums
29b86ea12822823c31b0c1ed6e7b476523a02175ab62a63435bcd9da6bea4963
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.3

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page