Highlighting States With Cartopy
Here is how to highlight select US States with Cartopy. (You can also highlight select countries with Cartopy.)
Define which states to highlight in states.csv
, and run states.py
:
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import shapely.geometry as sgeom
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
import pandas as pd
# derived from this example: https://scitools.org.uk/cartopy/docs/v0.15/examples/hurricane_katrina.html
def plot_states(df,projection,colors,annotation,title,edgecolor):
ax = plt.axes([0, 0, 1, 1],
projection=projection)
ax.background_patch.set_visible(False)
ax.outline_patch.set_visible(False)
ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())
shapename = 'admin_1_states_provinces_lakes_shp'
shpfilename = shpreader.natural_earth(resolution='110m',
category='cultural', name=shapename)
reader = shpreader.Reader(shpfilename)
states = reader.records()
values = list(df[title].unique())
for state in states:
attribute = 'name'
name = state.attributes[attribute]
# get classification
try:
classification = df.loc[state.attributes[attribute]][title]
except:
pass
ax.add_geometries(state.geometry, ccrs.PlateCarree(),
facecolor=(colors[values.index(classification)]),
label=state.attributes[attribute],
edgecolor='#FFFFFF',
linewidth=.25)
# legend
import matplotlib.patches as mpatches
handles = []
for i in range(len(values)):
handles.append(mpatches.Rectangle((0, 0), 1, 1, facecolor=colors[i]))
plt.legend(handles, values,
loc='lower left', bbox_to_anchor=(0.025, -0.0),
fancybox=True, frameon=False, fontsize=5)
# annotate
ax.annotate(annotation, xy=(0, 0), xycoords='figure fraction',
xytext=(0.0275, -0.025), textcoords='axes fraction',
horizontalalignment='left', verticalalignment='center', fontsize=4,
)
plt.title(title, fontsize=8)
title = title+'.png'
plt.savefig(title, bbox_inches='tight', pad_inches=.2, dpi=300)
print('Saved: {}'.format(title))
def main():
# df = pd.read_csv('states.csv')
df = pd.read_csv('states.csv', index_col='State')
# States Visited
projection = ccrs.LambertConformal()
title = 'States Visited'
colors = ['#71a2d6','#DDDDDD']
annotation = ''
plot_states(df,projection,colors,annotation,title,edgecolor='white')
# 13 Original Colonies
projection = ccrs.LambertConformal()
title = '13 Original Colonies'
colors = ['#DDDDDD','#71a2d6']
annotation = ''
plot_states(df,projection,colors,annotation,title,edgecolor='white')
print('Done.\n')
if __name__ == '__main__':
main()
For example, here are the 13 original colonies:
Or you can make a map of all states you have visited:
Note: This post may be helpful for adding Alaska and Hawaii.