Skip to content

Latest commit

 

History

History
180 lines (115 loc) · 6.01 KB

mapping.rst

File metadata and controls

180 lines (115 loc) · 6.01 KB

geopandas

python

import geopandas import matplotlib orig = matplotlib.rcParams['figure.figsize'] matplotlib.rcParams['figure.figsize'] = [orig[0] * 1.5, orig[1]] import matplotlib.pyplot as plt plt.close('all')

Mapping Tools

geopandas provides a high-level interface to the matplotlib library for making maps. Mapping shapes is as easy as using the plot() method on a GeoSeries or GeoDataFrame.

Loading some example data:

python

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres')) cities = geopandas.read_file(geopandas.datasets.get_path('naturalearth_cities'))

We can now plot those GeoDataFrames:

python

# Examine country GeoDataFrame world.head()

# Basic plot, random colors @savefig world_randomcolors.png world.plot();

Note that in general, any options one can pass to pyplot in matplotlib (or style options that work for lines) can be passed to the plot() method.

Choropleth Maps

geopandas makes it easy to create Choropleth maps (maps where the color of each shape is based on the value of an associated variable). Simply use the plot command with the column argument set to the column whose values you want used to assign colors.

python

# Plot by GDP per capta world = world[(world.pop_est>0) & (world.name!="Antarctica")] world['gdp_per_cap'] = world.gdp_md_est / world.pop_est @savefig world_gdp_per_cap.png world.plot(column='gdp_per_cap');

Creating a legend

When plotting a map, one can enable a legend using the legend argument:

python

# Plot population estimates with an accurate legend import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1) @savefig world_pop_est.png world.plot(column='pop_est', ax=ax, legend=True)

However, the default appearance of the legend and plot axes may not be desirable. One can define the plot axes (with ax) and the legend axes (with cax) and then pass those in to the plot call. The following example uses mpl_toolkits to vertically align the plot axes and the legend axes:

python

# Plot population estimates with an accurate legend from mpl_toolkits.axes_grid1 import make_axes_locatable fig, ax = plt.subplots(1, 1) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.1) @savefig world_pop_est_fixed_legend_height.png world.plot(column='pop_est', ax=ax, legend=True, cax=cax)

And the following example plots the color bar below the map and adds its label using legend_kwds:

python

# Plot population estimates with an accurate legend import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1) @savefig world_pop_est_horizontal.png world.plot(column='pop_est', ax=ax, legend=True, legend_kwds={'label': "Population by Country", 'orientation': "horizontal"})

Choosing colors

One can also modify the colors used by plot with the cmap option (for a full list of colormaps, see the matplotlib website):

python

@savefig world_gdp_per_cap_red.png world.plot(column='gdp_per_cap', cmap='OrRd');

The way color maps are scaled can also be manipulated with the scheme option (if you have mapclassify installed, which can be accomplished via conda install -c conda-forge mapclassify). The scheme option can be set to any scheme provided by mapclassify (e.g. 'box_plot', 'equal_interval', 'fisher_jenks', 'fisher_jenks_sampled', 'headtail_breaks', 'jenks_caspall', 'jenks_caspall_forced', 'jenks_caspall_sampled', 'max_p_classifier', 'maximum_breaks', 'natural_breaks', 'quantiles', 'percentiles', 'std_mean' or 'user_defined'). Arguments can be passed in classification_kwds dict. See the mapclassify documentation for further details about these map classification schemes.

python

@savefig world_gdp_per_cap_quantiles.png world.plot(column='gdp_per_cap', cmap='OrRd', scheme='quantiles');

Maps with Layers

There are two strategies for making a map with multiple layers -- one more succinct, and one that is a little more flexible.

Before combining maps, however, remember to always ensure they share a common CRS (so they will align).

python

# Look at capitals # Note use of standard pyplot line style options @savefig capitals.png cities.plot(marker='*', color='green', markersize=5);

# Check crs cities = cities.to_crs(world.crs)

# Now we can overlay over country outlines # And yes, there are lots of island capitals # apparently in the middle of the ocean!

Method 1

python

base = world.plot(color='white', edgecolor='black') @savefig capitals_over_countries_1.png cities.plot(ax=base, marker='o', color='red', markersize=5);

Method 2: Using matplotlib objects

python

import matplotlib.pyplot as plt fig, ax = plt.subplots()

# set aspect to equal. This is done automatically # when using geopandas plot on it's own, but not when # working with pyplot directly. ax.set_aspect('equal')

world.plot(ax=ax, color='white', edgecolor='black') cities.plot(ax=ax, marker='o', color='red', markersize=5) @savefig capitals_over_countries_2.png plt.show();

Other Resources

Links to jupyter Notebooks for different mapping tasks:

Making Heat Maps

python

matplotlib.rcParams['figure.figsize'] = orig

python

import matplotlib.pyplot as plt plt.close('all')