Plot chloropleth with consistent `legend` and bins
See original GitHub issueHow do I set a consistent colorscheme for three axes
in the same figure?
The following should be a wholly reproducible example to run the code and get the same figure I have posted below.
Get the shapefile data from the Office for National Statistics. Run this in a terminal as a bash
file / commands.
wget --output-document 'LA_authorities_boundaries.zip' 'https://opendata.arcgis.com/datasets/8edafbe3276d4b56aec60991cbddda50_1.zip?outSR=%7B%22latestWkid%22%3A27700%2C%22wkid%22%3A27700%7D&session=850489311.1553456889'
mkdir LA_authorities_boundaries
cd LA_authorities_boundaries
unzip ../LA_authorities_boundaries.zip
The python code that reads the shapefile and creates a dummy GeoDataFrame
for reproducing the behaviour.
import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
gdf = gpd.read_file(
'LA_authorities_boundaries/Local_Authority_Districts_December_2015_Full_Extent_Boundaries_in_Great_Britain.shp'
)
# 380 values
df = pd.DataFrame([])
df['AREA_CODE'] = gdf.lad15cd.values
df['central_pop'] = np.random.normal(30, 15, size=(len(gdf.lad15cd.values)))
df['low_pop'] = np.random.normal(10, 15, size=(len(gdf.lad15cd.values)))
df['high_pop'] = np.random.normal(50, 15, size=(len(gdf.lad15cd.values)))
Join the shapefile from ONS and create a geopandas.GeoDataFrame
def join_df_to_shp(pd_df, gpd_gdf):
""""""
df_ = pd.merge(pd_df, gpd_gdf[['lad15cd','geometry']], left_on='AREA_CODE', right_on='lad15cd', how='left')
# DROP the NI counties
df_ = df_.dropna(subset=['geometry'])
# convert back to a geopandas object (for ease of plotting etc.)
crs = {'init': 'epsg:4326'}
gdf_ = gpd.GeoDataFrame(df_, crs=crs, geometry='geometry')
# remove the extra area_code column joined from gdf
gdf_.drop('lad15cd',axis=1, inplace=True)
return gdf_
pop_gdf = join_df_to_shp(df, gdf)
Make the plots
fig,(ax1,ax2,ax3,) = plt.subplots(1,3,figsize=(15,6))
pop_gdf.plot(
column='low_pop', ax=ax1, legend=True, scheme='quantiles', cmap='OrRd',
)
pop_gdf.plot(
column='central_pop', ax=ax2, legend=True, scheme='quantiles', cmap='OrRd',
)
pop_gdf.plot(
column='high_pop', ax=ax3, legend=True, scheme='quantiles', cmap='OrRd',
)
for ax in (ax1,ax2,ax3,):
ax.axis('off')
I want all three ax
objects to share the same bins (preferable the central_pop
scenario quantiles
) so that the legend is consistent for the whole figure.
This way I should see darker colors (more red) in the far right ax
showing the high_pop
scenario.
How can I set the colorscheme bins for the whole figure / each of the ax
objects?
The simplest way I can see this working is either
a) Provide a set of bins to the geopandas.plot()
function
b) extract the colorscheme / bins from one ax
and apply it to another.
Issue Analytics
- State:
- Created 4 years ago
- Comments:10 (1 by maintainers)
Top GitHub Comments
Under the hood, geopandas uses mapclassify, and the easiest way to achieve what you want would be to just use it directly: