Daniel Pradilla
☰

bivariate climate map

2025

Loading 2025…

Your browser does not support canvas. Climate values can be explored using the city selector.
Loading European climate data…
Climate: TerraClimate · Boundaries: Natural Earth
Drag to pan · scroll or pinch to zoomSelect a land cell to inspect
About this map

Method & sources

An interactive adaptation of Milan Janosov’s bivariate climate map, using TerraClimate v1.1 for 1950–2025.

Climate variables

Annual mean maximum temperature (°C) is the average of TerraClimate v1.1’s 12 monthly maximum-temperature values for the selected year. It is not annual mean temperature or the hottest temperature recorded. Annual precipitation (mm) is the sum of the 12 monthly precipitation totals. Each frame shows one year, not a long-term climate normal.

The animation covers 1950–2025, including all 12 months of 2025. It uses the revised TerraClimate v1.1 dataset; values can differ from the older dataset used in the original tutorial.

How to read the classes

Thresholds are calculated once from each region’s pooled annual land-cell values across 1950–2025 and remain fixed during playback. Within a region, a colour represents the same temperature and precipitation ranges in every year. Numeric thresholds differ between regions; compare readings or use World when comparing continents. The reference method uses temperature percentiles 0, 20, 45, 70 and 100 and precipitation percentiles 0, 60, 78, 90 and 100. The quartile option uses 0, 25, 50, 75 and 100 for both variables. These are unweighted grid-cell percentiles, not equal land-area shares. Warmer is right and wetter is up.

2024 Americas comparison

The South America view uses the palette, percentile positions and smoothing from Janosov’s 2024 map. With revised TerraClimate v1.1 data, annual-only thresholds and our fixed 1950–2025 thresholds assign the same class to 50.1% of South American cells and 80.9% of North American cells in 2024. This comparison measures the effect of the threshold baseline on the same smoothed cells, not pixel agreement with the published image. The original tutorial used an older dataset.

Data coverage & geographic scope

Preparing annual TerraClimate data.

The map uses Natural Earth’s Europe country selection, clipped to 25°W–60°E and 34°N–72°N. It includes Iceland and Russia inside this window. Turkey, Cyprus and the Caucasus countries are classified as Asia and excluded; this is not a physical Europe–Asia boundary. Overseas territories and islands outside the window are excluded. Country boundaries are geographic context, not a statement about sovereignty.

The series contains 76 annual frames at native resolution (approximately 4 km). The fixed thresholds use 60,293,688 cell-year observations. See the annual frame index and fixed thresholds or the data preparation code to reproduce the selection.

By default, Gaussian smoothing with σ = 2 cells is applied to the selected region’s climate fields before classification against its raw thresholds, following the reference method. Turn off “Smooth zones” to see the original cells. The original method’s mean-fill approach can affect coastlines. Location inspection always reports original, unsmoothed values. A city selection reads a grid cell, not a weather station; local conditions can differ.

Each land cell requires all 12 months for both variables. The current data excludes 138 incomplete European land cells in every year. Annual values are stored at 0.01°C and 1 mm precision, and thresholds use these rounded raw values. The equal-area projection samples the nearest grid cell without blending class colours.

Location inspection, playback and downloads

Choose a continent or World in the title. Continents use the native approximately 4 km grid; World samples every sixth native cell, approximately 28 km at the equator. Small islands and coastal city centres can fall between land-cell centres, especially in World. Uncoloured land and locations without complete readings remain explicitly unavailable. No nearby value is substituted.

Click on the map or choose a city in “Inspect a location.” Its readings appear below the selector. Selecting a city highlights its dot with a three-second ripple, unless reduced motion is enabled. Antarctic options identify research stations. The selected frame’s data coverage is listed above. The legend’s “How to use” section explains colour selection, classification and smoothing.

Use the year slider or arrow buttons to inspect a year. Play advances one year at a time and stops at 2025; playing from the final year restarts at 1950. Changing the year pauses playback. Annual files load on demand, so a slow connection can reduce playback speed. The displayed year and location values change together once the next frame is ready. Download PNG saves the displayed frame with its year, legend and credits.

Source code & reproduction

The code is public on GitHub at danielpradilla/bivariate-climate-map: map and animation, page markup, styles, European data preparation, continent and World data preparation and the asset downloader. The original tutorials and data providers are credited alongside this section.

The climate-map.ipynb notebook rebuilds one year’s maps for all eight views from TerraClimate’s monthly NetCDF files. It shows the source metadata, the annual mean and sum, the land selection, the fixed thresholds and the smoothing step, then saves each map as a PNG with a provenance file.

The repository does not contain the generated map assets. To run the app locally, download the published assets with uv and serve the project folder over HTTP:

uv run --with-requirements requirements-data.txt python scripts/download_assets.pypython3 -m http.server 8000

The README lists the download size and options for selected regions and years. To rebuild Europe and then the other views from upstream monthly data instead:

uv run --with-requirements requirements-data.txt python scripts/build_data.pyuv run --with-requirements requirements-data.txt python scripts/build_data.py --regions

The region generator downloads compressed source rasters one year at a time, checks all 12 months, applies the land masks and writes sparse compressed annual assets. Source files use a temporary working directory and are removed after that year’s export; existing caches remain untouched. The region index links to each region’s frame index, thresholds and per-year provenance with download URLs, source hashes, revisions and processing details. Upstream revisions may change regenerated values.

Method & inspiration

Data & boundaries