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.

© 2005 Matthew Kudija | Source