Note
Go to the end to download the full example code.
Choropleth map
The pygmt.Figure.plot
method allows us to plot geographical data such as
polygons which are stored in a geopandas.GeoDataFrame
object. Use
geopandas.read_file
to load data from any supported OGR format such as a
shapefile (.shp), GeoJSON (.geojson), geopackage (.gpkg), etc. You can also use a full
URL pointing to your desired data source. Then, pass the class:geopandas.GeoDataFrame
as an argument to the data
parameter of pygmt.Figure.plot
, and style the
geometry using the pen
parameter. To fill the polygons based on a corresponding
column you need to set fill="+z"
as well as select the appropriate column using the
aspatial
parameter as shown in the example below.
import geodatasets
import geopandas as gpd
import pygmt
# Read the example dataset provided by geodatasets.
gdf = gpd.read_file(geodatasets.get_path("geoda airbnb"))
print(gdf)
Downloading file 'airbnb.zip' from 'https://geodacenter.github.io/data-and-lab//data/airbnb.zip' to '/home/runner/.cache/geodatasets'.
community ... geometry
0 DOUGLAS ... POLYGON ((-87.60914 41.84469, -87.60915 41.844...
1 OAKLAND ... POLYGON ((-87.59215 41.81693, -87.59231 41.816...
2 FULLER PARK ... POLYGON ((-87.6288 41.80189, -87.62879 41.8017...
3 GRAND BOULEVARD ... POLYGON ((-87.60671 41.81681, -87.6067 41.8165...
4 KENWOOD ... POLYGON ((-87.59215 41.81693, -87.59215 41.816...
.. ... ... ...
72 MOUNT GREENWOOD ... POLYGON ((-87.69646 41.70714, -87.69644 41.706...
73 MORGAN PARK ... POLYGON ((-87.64215 41.68508, -87.64249 41.685...
74 OHARE ... MULTIPOLYGON (((-87.83658 41.9864, -87.83658 4...
75 EDGEWATER ... POLYGON ((-87.65456 41.99817, -87.65456 41.998...
76 EDISON PARK ... POLYGON ((-87.80676 42.00084, -87.80676 42.000...
[77 rows x 21 columns]
fig = pygmt.Figure()
fig.basemap(
region=gdf.total_bounds[[0, 2, 1, 3]],
projection="M6c",
frame="+tPopulation of Chicago",
)
# The dataset contains different attributes, here we select the "population" column to
# plot.
# First, we define the colormap to fill the polygons based on the "population" column.
pygmt.makecpt(
cmap="acton",
series=[gdf["population"].min(), gdf["population"].max(), 10],
continuous=True,
reverse=True,
)
# Next, we plot the polygons and fill them using the defined colormap. The target column
# is defined by the aspatial parameter.
fig.plot(
data=gdf,
pen="0.3p,gray10",
fill="+z",
cmap=True,
aspatial="Z=population",
)
# Add colorbar legend.
fig.colorbar(frame="x+lPopulation", position="jML+o-0.5c+w3.5c/0.2c")
fig.show()
Total running time of the script: (0 minutes 0.616 seconds)