Skip to main content

watercolourmap

Watercolour maps in Python. Polygons are painted as soft washes on textured paper, with uneven pigment, darker edges and a thin line of bare paper between neighbouring shapes.

It's inspired by John Nelson's watercolour style for ArcGIS Pro, recreated in code so it works with any GeoDataFrame. You can see example prints at etymo.co.uk/cartography.

Install

pip install watercolourmap

Paint any polygons

import geopandas as gpd
import matplotlib.pyplot as plt
from watercolourmap import paint_gdf, PAPER

gdf = gpd.read_file("my_area.gpkg")
gdf = gdf.to_crs(gdf.estimate_utm_crs())          # needs a CRS in metres

img, extent = paint_gdf(
    gdf, "landuse",
    {"residential": "#c9a27e", "park": "#7a9a5a", "water": "#5f86b0"},
)

fig, ax = plt.subplots(figsize=(8, 8), facecolor=PAPER)
ax.imshow(img, extent=extent)
ax.set_axis_off()
fig.savefig("map.png", dpi=300, facecolor=PAPER)
  • Polygons whose value isn't in the colour dictionary are left as bare paper.
  • pixel_size sets the resolution in metres per pixel. By default the longer side is about 3,000 pixels.
  • seed changes the brushwork.

Print posters from Copernicus Urban Atlas

The command line tool turns a Copernicus Urban Atlas city file into a print-ready poster. You get a title, the painted map, a legend painted with the same brush, a scale bar and the data credit, saved as PDF and PNG.

# An irregular circle, 1.8 km radius, with place labels
watercolourmap ELBASAN.fgb --center 20.097 41.106 --radius 1.8 \
    --title "Elbasan Land Cover" \
    --label "Kalaja|20.080|41.1125" --label "Lumi Shkumbin|20.0975|41.1006|-4" \
    --paper A2 --out elbasan

# A 12 km rectangle with a hand-torn edge, and the sea painted in
watercolourmap ATHINA.fgb --center 23.688 37.958 --width 12 --sea \
    --title "Athens Land Cover" --paper A2 --out athens

Run watercolourmap --help for every option: --bbox or --clip for other areas, --signature and --website to sign your map, and --dpi 100 for quick drafts.

Urban Atlas codes are grouped into seven classes: Blue, Green, Green-Grey and Grey Cover, Land Use Changing, Unknown and Other Natural. Roads and railways are left as bare paper. Urban Atlas maps land use rather than land cover, so some groupings are judgement calls. For example, marinas are coded as sports and leisure. You can see the full mapping in urban_atlas_class().

Keep the credit on your maps. The tool adds it by default: Contains modified Copernicus Land Monitoring Service information (Urban Atlas 2021) © European Union.

Building blocks

Function What it does
paint_gdf(gdf, column, colours) Paints any polygons and returns an image and its extent
poster(gdf, legend, out, ...) Lays out a full poster from polygons with integer classes
paint(classes, colours, pixel_size) Paints a raster of class ids
irregular_circle(gdf, centre, radius) Keeps whole parcels inside a circle, for a ragged, parcel-shaped edge
read_urban_atlas(path, bbox) Reads an Urban Atlas file and adds the legend class
IGNITION The default seven-class legend and colours

Credits

  • Watercolour style: inspired by John Nelson (Esri).
  • Legend: from the University of Manchester IGNITION project land cover map.
  • Fonts: Lora (SIL Open Font License) and FreeSerif (GPL with font exception) are bundled.

MIT licence © 2026 Eriola Trungu Impersimi

Metadata

Release files for watercolourmap 0.1.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 watercolourmap 0.1.0
File Size Uploaded Provenance
watercolourmap-0.1.0.tar.gz 798.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for watercolourmap 0.1.0
File Interpreter ABI Platform
watercolourmap-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.6 MB

Release files / watercolourmap-0.1.0.tar.gz

Download URL watercolourmap-0.1.0.tar.gz
Size 798.2 kB
Tags Source
SHA-256 checksum
How to use checksums
a39b2c20ea3a1475d17ae4feeaacffe9bc9ec45082b1c6ed2cca83f18f119234
BLAKE2b-256 checksum
How to use checksums
f50b4aa870ce460d0ba1005859242bcb0b4be1cdd8db9072263ab6fbd12c3ae4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.10

Release files / watercolourmap-0.1.0-py3-none-any.whl

Download URL watercolourmap-0.1.0-py3-none-any.whl
Size 801.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cd267e4f15d2ffaee7aabd02408ce61c585a0ad4451cbb97dc76e68af84ac14b
BLAKE2b-256 checksum
How to use checksums
39229f2fb21fc747290515b416237c9fd55ab1316ef9117fc2584512cae6cf78
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.10

Security for watercolourmap 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

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