4 votos

Python: el color de las provincias Canadienses en un shapefile basado en los valores dados

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:

enter image description here

2voto

user49191 Puntos 11

En el espíritu de tu pregunta, yo también haría uso de la GeoPandas como gen, dijo. Sin embargo también voy directamente a responder a su pregunta de cómo hacer esto en matplotlib...

Crear un objeto de mapa de valores continuos a los colores. ScalarMappable es el matplotlib clase para hacer esto, y le puede dar un Normalize comportamiento para anclar el mínimo y el máximo rango de la values desea representar a la extrema colores del mapa de colores.

cmap = matplotlib.cm.get_cmap('OrRd')
norm = matplotlib.colors.Normalize(min(myvalues.values()), max(myvalues.values()))
color_producer = matplotlib.cm.ScalarMappable(norm=norm, cmap=cmap)

Ahora color_producer tiene un método to_rgba que toma los valores de values y los convierte en los colores correctos. Los colores que volver a tomar las formas de RGBA tuplas (Rojo, Verde, Azul, & transparencia Alfa).

Ahora al crear cada provincia PatchCollection, puede establecer su facecolor a la RGBA tupla devuelto por color_producer:

# Change the province name passed as you iterate through provinces.
rgba = color_producer.to_rgba(myvalues['Manitoba'])
PatchCollection(ptchs, facecolor=rgba, edgecolor='k', linewidths=.5)

2voto

GreyCat Puntos 146

La forma más sencilla es utilizar GeoPandas

import geopandas as gpd
# read the shapefile as a GeoDataFrame
can = gpd.GeoDataFrame.from_file("CAN_adm1.shp")
# The first element
can.head(5)
### many data 
#plot the shapefile/GeoDataFrame
can.plot()

enter image description here

Incluso se puede trazar una columna

can.plot(column='NAME_1');

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X