The following python program show you the method to draw a rectangular area in a map and mark state or province name on the map.
Answer to other questions:
- How to add ocean, lake, river, coastline, province border to map?
- How to set map extent?
- How to set xtick or ytick intervals?
# Ignore warnings
import sys
import warnings
if not sys.warnoptions:
warnings.simplefilter('ignore')
#Process data
import numpy as np
#Display data
import cartopy
import cartopy.crs as ccrs
from cartopy.mpl.geoaxes import GeoAxes
from cartopy.vector_transform import vector_scalar_to_grid
from matplotlib.axes import Axes
import cartopy.feature as cfeature
from cartopy import config
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from mpl_toolkits.axes_grid1 import AxesGrid
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from shapely.geometry.polygon import LinearRing
%matplotlib inline
#-------------------------------------------------------------
provinces= ['Ontario', 'Quebec','Manitoba','Wisconsin','Vermont','Nebraska','New York','Kansas','Illinois',
'Delaware','Connecticut','Indiana','Missouri','Michigan','New Jersey','Kentucky','Minnesota',
'Ohio','Iowa','Pennsylvania','Maryland','Virginia','West Virginia','North Dakota','South Dakota','Nunavut']
Latitudes= [50,53,56.4,44.5,44,41.5,43,38.5,40,39,41.6,40.3,38.6,44.2,39.8,37.8,46.4,
40.4,42,41.2,39,38,39,47.7,44.5,62]
Longitudes=[-85,-76,-98.7,-89.5,-72,-100,-75,-98,-89,-73.5,-72.7,-86,-92.6,-84.5,-74.9,-84.3,-94.6,
-83,-93.6,-77.2,-76.6,-78,-80.5,-99,-99,-98]
#-------------------------------------------------------------
fig = plt.figure(figsize=(25,25))
projection = ccrs.PlateCarree()
provinc_bodr = cartopy.feature.NaturalEarthFeature(category='cultural',
name='admin_1_states_provinces_lines', scale='50m', facecolor='none', edgecolor='k')
axes_class = (GeoAxes,
dict(map_projection=projection))
axgr = AxesGrid(fig, 111, axes_class=axes_class,
nrows_ncols=(1, 1),
axes_pad=0.6,
label_mode='') # note the empty label_mode
for i, ax in enumerate(axgr):
ax.add_feature(cfeature.OCEAN, alpha=0.3)
ax.add_feature(cfeature.COASTLINE,linewidth=0.3)
ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=1)
ax.add_feature(cfeature.LAKES, alpha=1)
ax.add_feature(cfeature.RIVERS)
ax.add_feature(cfeature.NaturalEarthFeature('physical', 'land', '50m', \
edgecolor='none', facecolor="white"), zorder=1)
ax.add_feature(provinc_bodr, linestyle='-', linewidth=1, edgecolor="k", zorder=10, alpha=0.3)
ax.set_xticks(np.linspace(-100, -70, 5), crs=projection)
ax.set_yticks(np.linspace(35, 65, 5), crs=projection)
lon_formatter = LongitudeFormatter(zero_direction_label=True)
lat_formatter = LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
ax.set_extent([-100, -70, 35, 65])
# mark the state name
for iprov in range(26):
ax.text(Longitudes[iprov],Latitudes[iprov],provinces[iprov],fontsize=18)
# plot the rectangular region
#-----------------------------------------------------------------
lons = [-94, -74, -74, -94]
lats = [40, 40,51,51]
ring = LinearRing(list(zip(lons, lats)))
ax.add_geometries([ring], ccrs.PlateCarree(), facecolor='none', edgecolor='green',linewidth=3)
#------------------------------------------------------------------
plt.show()
The result is shown as blow:
