El objetivo aquí es crear un choropleth mapa de Canadá en Python. Supongamos que tengo un diccionario con los valores de referencia para cada provincia Canadiense/territorio:
values={'Alberta': 1.0,
'British Columbia': 2.0,
'Manitoba': 3.0,
'New Brunswick': 4.0,
'Newfoundland and Labrador': 5.0,
'Northwest Territories': 6.0,
'Nova Scotia': 7.0,
'Nunavut': 8.0,
'Ontario': 9.0,
'Prince Edward Island': 10.0,
'Quebec': 11.0,
'Saskatchewan': 12.0,
'Yukon': 13.0}
Ahora quiero el color de cada provincia, basado en el valor correspondiente en values
, el uso de un continuo de mapa de colores (por ejemplo, tonos de rojo). Cómo hacerlo?
Hasta ahora sólo he sido capaz de trazar las provincias Canadienses/territorio dentro de matplotlib, pero sus formas aparecen en un color único, y no sé cómo cambiar que de acuerdo a los números en values
.
Aquí es donde usted puede encontrar el archivo de forma: http://www.filedropper.com/canadm1
Y este es mi código de fecha:
import shapefile
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
# -- input --
sf = shapefile.Reader("myfolder\CAN_adm1.shp")
recs = sf.records()
shapes = sf.shapes()
Nshp = len(shapes)
cns = []
for nshp in xrange(Nshp):
cns.append(recs[nshp][1])
cns = array(cns)
cm = get_cmap('Dark2')
cccol = cm(1.*arange(Nshp)/Nshp)
# -- plot --
fig = plt.figure()
ax = fig.add_subplot(111)
for nshp in xrange(Nshp):
ptchs = []
pts = array(shapes[nshp].points)
prt = shapes[nshp].parts
par = list(prt) + [pts.shape[0]]
for pij in xrange(len(prt)):
ptchs.append(Polygon(pts[par[pij]:par[pij+1]]))
ax.add_collection(PatchCollection(ptchs,facecolor=None,edgecolor='k', linewidths=.5))
ax.set_xlim(-160,-40)
ax.set_ylim(40,90)
Esta es la imagen que yo estoy haciendo hasta ahora: