Trazar un mapa de coropletas (con geopandas) usando un esquema de clasificación definido por el usuario

Soy un poco nuevo en Python, así que espero que la respuesta a mi pregunta sea relativamente sencilla.

Estoy tratando de hacer un mapa de coropletas usando geopandas. Sin embargo, dado que estoy haciendo varios mapas que deben compararse entre sí, es indispensable que use un esquema de clasificación de datos personalizado (en lugar de cuantiles o jenks). Por lo tanto, he estado tratando de trabajar con el esquema definido por el usuario, y puedo crear los contenedores pero no sé cómo aplicarlos al mapa en sí.

Esto es lo que hice para crear mi esquema de clasificación:

import pysal.esda.mapclassify as ps from pysal.esda.mapclassify import User_Defined bins = [5, 20, 100, 600, 1000, 3000, 5000, 10000, 20000, 400000] ud = User_Defined(projected_world_exports['Value'], bins) 

(donde ‘Valor’ es la columna que trazo en el mapa)

Y luego, cuando bash trazar el mapa de las coropletas, no sé cómo debe llamarse el esquema.

  projected_world_exports.plot(column='Value', cmap='Greens', scheme = ?????) 

¡Si alguien pudiera ayudarme, estaría enormemente agradecido!

Gracias x

Eché un vistazo al código de la función de trazado de geopandas ( https://github.com/geopandas/geopandas/blob/master/geopandas/plotting.py ) pero supongo que el método de plot solo acepta uno de los tres nombres (“cuantiles “,” equal_interval “,” fisher_jenks “) pero no directamente una lista de contenedores o un clasificador User_Defined como User_Defined .
(Supongo que podría estar vinculado a ese problema en el que el último comentario trata sobre la definición de una API para la agrupación “definida por el usuario”)

Sin embargo, por ahora supongo que puedes lograrlo modificando y reutilizando ligeramente las funciones del archivo que vinculé. Por ejemplo, puedes reescribir tu propia versión de plot_dataframe como esta:

 import numpy as np def plot_dataframe(s, column, binning, cmap, linewidth=1.0, figsize=None, **color_kwds): import matplotlib.pyplot as plt values = s[column] values = np.array(binning.yb) fig, ax = plt.subplots(figsize=figsize) ax.set_aspect('equal') mn = values.min() mx = values.max() poly_idx = np.array( (s.geometry.type == 'Polygon') | (s.geometry.type == 'MultiPolygon')) polys = s.geometry[poly_idx] if not polys.empty: plot_polygon_collection(ax, polys, values[poly_idx], True, vmin=mn, vmax=mx, cmap=cmap, linewidth=linewidth, **color_kwds) plt.draw() return ax 

Entonces necesitarías definir las funciones _flatten_multi_geoms y plot_polygon_collection copiándolos y estás listo para usarlo así:

 bins = [5, 20, 100, 600, 1000, 3000, 5000, 10000, 20000, 400000] ud = User_Defined(projected_world_exports['Value'], bins) plot_dataframe(projected_world_exports, 'Value', ud, 'Greens') 

Aquí hay un enfoque alternativo que no requiere modificar el código de geopandas. Implica primero etiquetar los contenedores para que pueda crear un mapa de colores personalizado que asigne cada etiqueta de contenedor a un color específico. Luego se debe crear una columna en su geodataframe que especifique qué etiqueta bin se aplica a cada fila en el geodataframe, y esta columna se usa para trazar la choropleth usando el mapa de colores personalizado.

 from matplotlib.colors import LinearSegmentedColormap bins = [5, 20, 100, 600, 1000, 3000, 5000, 10000, 20000, 400000] # Maps values to a bin. # The mapped values must start at 0 and end at 1. def bin_mapping(x): for idx, bound in enumerate(bins): if x < bound: return idx / (len(bins) - 1.0) # Create the list of bin labels and the list of colors # corresponding to each bin bin_labels = [idx / (len(bins) - 1.0) for idx in range(len(bins))] color_list = ['#edf8fb', '#b2e2e2', '#66c2a4', '#2ca25f', '#006d2c', \ '#fef0d9', '#fdcc8a', '#fc8d59', '#e34a33', '#b30000'] # Create the custom color map cmap = LinearSegmentedColormap.from_list('mycmap', [(lbl, color) for lbl, color in zip(bin_labels, color_list)]) projected_world_exports['Bin_Lbl'] = projected_world_exports['Value'].apply(bin_mapping) projected_world_exports.plot(column='Bin_Lbl', cmap=cmap, alpha=1, vmin=0, vmax=1)