Clase 042 — Visualización geográfica (Plotly / folium)
Parte: 0 — Prerrequisitos · Fuente: Plotly Choropleth docs · folium docs · Cartographies of the Mind (background). ⏱️ Duración estimada: 60 min.
🎯 Objetivo
Que el alumno construya mapas básicos cuando los datos tienen componente geográfico: folium (mapas Leaflet interactivos, markers, choropleth), plotly (choropleth, scatter geo). Sin entrar a GIS profundo (eso es geopandas, fuera del scope de Parte 0).
📚 Resultados de aprendizaje
Al finalizar la clase, el alumno podrá:
- Crear mapa folium centrado, con tile layer básico.
- Añadir markers con popup, tooltip, color según valor.
- Construir choropleth (mapa de calor por región) con folium o plotly.
- Decidir entre folium y plotly geo según destino (HTML standalone vs dashboard).
- Citar fuentes de tiles y GeoJSON públicos.
🗺️ Temas
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Sistemas de coordenadas: lat/lng | Convención: lat primero en folium, lng primero en plotly. |
| 2 | folium: mapa + markers + popups | Mapas Leaflet en notebook. |
| 3 | folium choropleth con GeoJSON | Mapas de calor por país/región. |
| 4 | plotly choropleth y scatter_geo | Cuando ya usas plotly. |
| 5 | Tile providers (OSM, CartoDB) | Estética y licencia. |
| 6 | Cuándo geopandas | Análisis geoespacial real. |
📖 Definiciones y características
- Coordenadas geográficas (lat, lng)
- Latitud (-90 a 90): N/S del ecuador. Longitud (-180 a 180): E/W de Greenwich. Convención y orden varía: folium
[lat, lng], GeoJSON[lng, lat]— fuente clásica de bugs. - folium
- Wrapper Python de Leaflet.js. Mapas interactivos (zoom, pan, popups) embebidos en notebook como HTML. Ideal para exploración.
- plotly geo
- Mapas en plotly (scatter_geo, choropleth). Bonitos, interactivos, integran con dashboards Plotly/Dash. Para choropleth de países usa códigos ISO-3.
- Choropleth
- Mapa de calor por región: color de cada polígono representa un valor (PIB, población, casos). Requiere GeoJSON con las shapes.
- Tile provider
- Servidor de "baldosas" (imágenes 256×256) que componen el mapa de fondo. OpenStreetMap (default), CartoDB (limpio), Mapbox (premium).
- geopandas
- Extensión de pandas con geometrías (Shapely). Para análisis espacial (intersection, buffer, dissolve), no solo visualizar. Fuera del scope Parte 0.
📂 Dataset / recursos
Sintético: lista de ciudades con coords + métrica simulada. GeoJSON de países público desde un CDN para choropleth.
🧪 Ejercicios
1. Mapa con markers. 5 ciudades españolas con marker y popup mostrando nombre + población.
2. Markers coloreados. Mismo, pero color verde si pop>1M, rojo si <500k.
3. Choropleth folium. Mapa mundial con un valor sintético por país (ej: PIB).
4. Choropleth plotly. Lo mismo con plotly.express.choropleth.
5. Comparar. ¿Cuándo folium (mapa físico explorable) vs plotly (integra con dashboard)?
📝 Homework verificable
Notebook: (a) mapa folium con 10+ markers + popups + tooltips; (b) choropleth folium de un dataset por país; (c) mismo choropleth con plotly express; (d) reporte 1-párrafo comparando ambos.
Criterio de aceptación: Mapas funcionales en notebook; popups muestran info correcta; choropleth con leyenda.
⚠️ Errores comunes
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| Marcadores aparecen en medio del océano | Invertiste lat/lng. Fix: folium espera [lat, lng]. Para Madrid: [40.42, -3.70] (lat positiva, lng negativa). |
| Mapa folium no se renderiza en VS Code | Algunas extensiones de notebook no muestran HTML inline complejo. Fix: m.save('mapa.html') y abre en navegador. |
| choropleth plotly sale gris | El código ISO no matchea con el shape. Fix: usa ISO-3 ('ESP' no 'ES'). Verifica que los códigos del dataset coinciden con los esperados. |
| Mapa pesa MB y carga lento | Demasiados markers (>1000). Fix: usa MarkerCluster (folium.plugins.MarkerCluster) que agrupa por zoom level. |
| Tiles fallan a cargar | Provider con rate limit (Mapbox sin token, Stamen down). Fix: usa 'OpenStreetMap' o 'CartoDB positron' que son gratis sin token. |
❓ Preguntas frecuentes
❓ ¿folium o plotly?
folium para exploración interactiva en notebook (mapa real con zoom/pan/popups). plotly para integrar en dashboard o cuando ya usas plotly. Ambos producen HTML standalone.
❓ ¿Cómo encuentro lat/lng de un lugar?
Click derecho en Google Maps → "¿Qué hay aquí?". O geocodifica con geopy (from geopy.geocoders import Nominatim).
❓ ¿GeoJSON dónde lo consigo?
Para países: Natural Earth (público). Para regiones: portal gov del país. Para custom: dibuja en geojson.io.
❓ ¿Cuándo necesito geopandas?
Análisis espacial real: "¿cuántos puntos caen en este polígono?", "buffer de 1km alrededor", re-proyección entre CRS. Para solo visualizar puntos en mapa: folium basta.
❓ ¿Mapas offline?
Tiles son online por default. Para offline: descarga tiles con mbtiles, sirve local con folium.raster_layers.TileLayer(url='file://...'). Setup complejo, considera si vale.
🔗 Referencias
📥 Material descargable
- 📄 Guía explicativa (PDF) — versión imprimible con todo el contenido de la clase.
- 🎞️ Presentación (PPTX) — deck PowerPoint listo para proyectar en clase.
- 🧮 Notebook ejecutable (.ipynb) — abrilo desde el laboratorio del programa o desde Jupyter.
➡️ Siguiente clase
Clase 043 — SQL fundamental: SELECT, WHERE, JOIN, GROUP BY, HAVING