Maps & visualisation
Static plots, choropleths, interactive maps, and exporting images people can use.
Matplotlib draws data and knows nothing about maps. It has no concept of scale, of north, of what a colour means. GeoPandas adds one convenience — a legend derived from the column you plotted — and everything else is drawn by hand. That is the constraint this topic works within.
The decisions matter more than the code. A choropleth of counts is mostly a map of where the people are, so a rate needs a denominator you can defend. A classification scheme is a claim about the distribution, and the same numbers with different breaks produce maps that say different things — both honestly. A scale bar asserts that one length is the same everywhere on the map, which is false in EPSG:4326 and approximate in Web Mercator.
The pages run from what those decisions are, through the plots and interactive maps themselves, to the specific reasons a map comes out blank, upside down or in one colour.
🧭 Start with the concepts
The ideas the how-to guides below assume you already have.
- How to Create Interactive Maps in Python with Folium
- How QGIS Styling Works: Renderers, Symbols and Rules
- Choosing a Map Projection for Display: What Web Mercator Distorts
- Choropleth Classification Explained: Quantiles, Equal Interval and Natural Breaks
- Kernel Density Explained: What a Heatmap Actually Shows
- Isochrones Explained: Travel Time Areas and What They Assume
Show every concept in this topic
- Web Map Tiles Explained: XYZ, Zoom Levels and the Tile Pyramid
- Vector Tiles Explained: MVT, Layers and Why They Are Not GeoJSON
- Visual Hierarchy Explained: What a Map Reader Sees First
- Colour on Maps Explained: Sequential, Diverging and Qualitative
- Labelling Explained: Why Automatic Map Labels Collide
- Which Map Elements Are Actually Required
- Accessible Maps Explained: Contrast, Text and Alternatives
- Spatial Dashboards Explained: When an App Beats a Map Image
- Counts, Rates and Densities: What a Demographic Map Should Show
- Urban Morphology Explained
- Election Maps Explained: What a Results Map Can and Cannot Say
- Rhumb Line vs Great Circle Explained
- Choosing a Python Map Library: Folium, Plotly, pydeck, Lonboard and Cartopy Explained
- Interactive vs Static Maps, Explained
⚙️ Then do the task
Step-by-step walkthroughs with code you can copy and adapt.
- How to Plot Maps in Python with GeoPandas and Matplotlib
- How to Create a Choropleth Map in Python with GeoPandas
- How to Save a Map as an Image in Python with Matplotlib
- How to Style Layers and Export Map Layouts from PyQGIS
- How to Add a Basemap to a GeoPandas Map with contextily
- How to Add Legends, Labels and a Scale Bar to a GeoPandas Map
Show every how-to guide in this topic
- How to Plot Multiple Layers on One Map in GeoPandas
- How to Batch-Generate a Map Image for Every Region in Python
- How to Set Up Jupyter for Python GIS Work
- Your First Python GIS Analysis: From Download to Map in One Script
- How to Make a Point Density Heatmap in Python
- How to Find Hotspots with Getis-Ord Gi* in Python
- How to Make a Hillshade from a DEM in Python
- How to Generate Isochrones in Python
- How to Prepare a GeoDataFrame for the Web
- How to Style Data-Driven Colours in a Web Map
- How to Add Interactivity and Popups to a Web Map
- How to Animate Movement Over Time in Python
- How to Choose and Test a Colour Ramp in Python
- How to Check a Map for Colour-Blind Readers
- How to Label Map Features Without Overlaps in Matplotlib
- How to Add a Scale Bar and North Arrow to a Python Map
- How to Build a Print-Ready Map Layout in Matplotlib
- How to Export a Map at Print Quality: DPI, Vector and Fonts
- How to Add an Inset and Locator Map in Python
- How to Build a Streamlit App with an Interactive Map
- How to Add Filters and Widgets That Drive a Map
- How to Let Users Draw an Area of Interest in a Map App
- How to Link a Map and a Chart So One Selection Drives Both
- How to Aggregate Points into H3 Hexagons and Map Them
- How to Turn H3 Cells into a GeoDataFrame of Polygons
- How to Normalise Census Counts into Rates and Densities
- How to compute building shadows for a given time in Python
- How to generate depth contours from bathymetry
- How to map transit routes and stops from GTFS shapes
- How to Draw a Distortion Grid on an Old Map in Python
- How to Map Sea-Ice Concentration in Python
- How to Make a US County Election Map in Python
- How to Make an Election Swing Map in Python
- How to Map German Federal Election Results in Python
- How to Make a Dot-Density Election Map in Python
- How to Make a Proportional-Symbol Election Map in Python
- How to Map Population Density per km² from a Population Grid in Python
- How to Map Sea Surface Temperature Anomalies in Python
- How to Map Marine Heatwave Days in Python
- How to Find the Midpoint and Great-Circle Path Between Two Coordinates in Python
- How to Make a Choropleth Map With Plotly in Python
- How to Plot Points on an Interactive Map With Plotly in Python
- How to Make a Density Heatmap Map With Plotly in Python
- How to Animate Points on a Map With Plotly in Python
- How to Make a Map With Cartopy in Python
- How to Make a Weather Map in Python
- How to Map Airbnb Prices by Neighbourhood in Python
- How to Map House Prices by Local Authority in Python
- How to Map Flight Delays by Airport in Python
- How to Map Lorry Traffic and Freight Corridors from Count Points
- How to Map Tornado Tracks from Storm Events Begin and End Points
- How to Map a Hurricane Season's Tracks Coloured by Intensity
- How to Map a Hurricane's Flood Insurance Claims: Harvey, Ian and Helene
- What Share of Washington's Cars Are Electric? EV Adoption County by County
- How to Map Restaurant Inspection Scores by Neighbourhood
🔧 When it breaks
The errors this topic produces, with the cause explained rather than just the command.
- Why Does My GeoPandas Map Look Upside Down?
- Why Is My GeoPandas Plot Blank or Empty? How to Fix It
- My Points Plot in the Ocean: Fixing Swapped Latitude and Longitude
- My GeoPandas Choropleth Colours Look Wrong: How to Fix It
- My Folium Map Is Blank or Will Not Display: How to Fix It
- Your Heatmap Looks Wrong: KDE Bandwidth and Cell Size
Show every fix in this topic
- Hillshade Looks Flat, Washed Out or Inverted
- Fixing Map Labels That Overlap or Get Clipped
- Fixing Map Text That Is Too Small in the Exported File
- Fixing Map Colours That Change Between Screen and Print
- Fixing a NetCDF Map That Is Shifted, Flipped or Split at 180°
- Fixing H3 Hexagons That Stretch Across the Map at the Antimeridian
- Fixing an H3 Map That Misleads: Unequal Cell Areas and Empty Cells
- Fixing a Rate Map Dominated by Tiny, Nearly Empty Areas
- Shadows point the wrong way or have the wrong length
- GTFS routes draw as straight lines between stops
- Fixing a Plotly Choropleth Map That Shows No Colours
Learning paths through this topic
A curated route rather than a list — the guides in the order that builds on itself.
- Spatial Statistics
- Terrain & Elevation
- Networks & Routing
- Making Maps
- GIS Data Cleaning
- QGIS Automation
- Publishing Web Maps
- Movement & Time
- Cartography & Map Design
- Maps, Apps & Dashboards
- Gridded & Climate Data
- H3 & Global Grids
- Census & Demographics
- 3D & Buildings
- Coastal & Marine
- Public Transit & GTFS
- Urban Morphology
Related topics
Subjects that keep coming up alongside this one, most overlap first.