40.7 Mapas Coropletas
Los mapas coropletas son una forma de visualizar cómo varía una medida continua en un área geográfica o región.
Se presenta cómo formar uno sobre Letleaf por medio de Folium.
import numpy as np
import pandas as pd
# import json, geojson
import math
import matplotlib.pyplot as plt
# import pyogrioSe representará el valor en miles de dolares FOB de las exportaciones según departamento de donde han sido obtenidas o manufacturadas las mercancías, bajado del DANE (https://microdatos.dane.gov.co/index.php/catalog/472). Año 2021. El valor FOB es un término utilizado en Comercio Exterior para determinar que el vendedor entrega la mercancía a bordo del medio de transporte en el puerto de embarque convenido y el comprador asume todos los gastos y riesgos desde el lugar de entrega hasta el país de compra.
Sólo contiene el código DANE del departamento y el valor FOB. El departamento 0 no es válido. Corresponde a las exportaciones de petróleo y derivados, las cuales no están geolocalizadas, se eliminan del análisis. Y adicionalmente, se coloca el valor FOB en Millones.
df = df.loc[df['dpto2'] != 0].copy()
df['FOB'] = pd.to_numeric(df['FOB'], errors='coerce') / 1_000_000Los códigos de departamento deben ser estilo caracter, con dos dígitos, es decir, hay que pasar 5 a 05 y 8 a 08
Dejamos sólo los necesarios
Se tiene un archivo geo.json con la subdivisión político administrativa a nivel de departamento.
from pathlib import Path
data_dir = Path("C:/Users/HP/Documents/Docencia/Externado/Cursos/Visualizacion/Datos/market-price.csv").parent
mapa_dptos2 = gpd.read_file(data_dir/'DptosColombia.geo.json')
type(mapa_dptos2)Obsérvese que describe los polígonos limítrofes de cada departamento. El resultado:

Se genera el mapa, pero antes se filtran las dos columnas que interesan.
Se podrían fusionar los datos de FOB en el geopandas data frame:
Para crear el mapa se requieren los siguientes elementos:
Una data geográfica, que es un archivo GeoPandas. Para el ejemplo, mapa_dptos.
Un data frame con los datos. Para el ejemplo, df.
Las columnas, que son las variables que intervendrán en la conformación del mapa. Para el ejemplo, el código del departamento (DPTO) y el valor con que se asigna el color (FOB).
La llave (key_on) que empalma los polígonos del mapa con los valores del data frame. Para el ejemplo es DPTO, que se obtiene indicando su ubicación en el geo.json: feature.properties.DPTO. Para ubicarlo debe ser explorado el archivo geo.json con un editor de textos y anotar el nombre de la característica (feature) que interesa. Se puede utilizar geo_data = mapa_dptos2 y data = mapa_dptos2 si se han fusionado los datos en el GeoPandas, o mencionar cada uno:
mapa = folium.Map(location=[4.3556, -74.0451], zoom_start=5)
folium.Choropleth(geo_data=mapa_dptos,
name="choropleth",
data=df,
columns=["DPTO", "FOB"],
key_on="feature.properties.DPTO",
fill_color="YlGn",
fill_opacity=0.7,
line_opacity=1,
legend_name="Exportaciones en miles de US$").add_to(mapa)
folium.LayerControl().add_to(mapa)
mapa.save("mapa_v1.html")Primero se carga el mapa por defecto, un leaflet basado en un mapa OpenStreeetMap. Y luego se añade por encima una capa (layer) del mapa coropleto.
Como es usual, a más oscuro el color, más intensa la característica presentada. Para el ejemplo, mayores las exportaciones en dólares FOB.
Los departamentos sin datos son de color negro por defecto, pero puede confundir la intensidad del color. Es mejor pasarlos a color blanco. También se puede controlar la leyenda de tal modo que sean número redondos. La leyenda automática tienen seis colores, así que se crea un vector con espaciado uniforme, pero con cortes en números enteros.
# world_geo = r'world_countries.json'
limite = df['FOB'].max()
tope = math.ceil(limite/1000)*1000 # 7000
umbrales = np.arange(0, tope + 1000, 1000).tolist()
print(umbrales)mapa = folium.Map(location=[4.3556, -74.0451], zoom_start=5)
folium.Choropleth(geo_data=mapa_dptos,
name="choropleth",
data=df,
columns=["DPTO", "FOB"],
key_on="feature.properties.DPTO",
threshold_scale=umbrales,
fill_color="YlGn",
fill_opacity=0.7,
line_opacity=1,
nan_fill_color = "White",
legend_name="Exportaciones en miles de US$").add_to(mapa)
folium.LayerControl().add_to(mapa)
mapa.save("mapa_v2.html")Cambié el nan_fill_color a blanco.
Otros argumentos:
min_zoom (int, por defecto 0) - Nivel de zoom mínimo permitido.
max_zoom* (int, por defecto 18) - Nivel de zoom máximo permitido.
control_scale (bool, por defecto False) - Si se añade una escala de control en el mapa.
zoom_control (bool, por defecto True) - Muestra controles de zoom en el mapa.
También el mapa base puede tener argumentos adiconales:
name (str, por defecto None) - El nombre de la capa featureGroup. Se mostrará en el LayerControl. Si es None se llamará a get_name() para obtener el nombre técnico.
overlay (bool, por defecto True) - Si la capa será una capa superpuesta (marcada con una casilla de verificación en LayerControls) o una capa base (marcada con un botón de radio).
control (bool, por defecto True) - Si la capa se incluirá en LayerControls.