Mapas


Un mapa es un conjunto de elementos de un mismo tipo o categoría que tienen una distribución espacial determinada. La mayoría de los mapas que consumimos son geográficos.

Así es como se produce un mapa en altair:

# primero importamos las bibliotecas necesarias
# estos alias son convenciones populares
# pero no son requisitos estrictos

import altair as alt
import json

Si estas trabajando con este notebook en un jupyter notebook y no el jupyter lab requerirás ejecutar el siguiente código también.

alt.renderers.enable("notebook")

Los datos con los que vamos a trabajar son de Diego Valle-Jones y de INEGI. En este caso, es un GeoJSON de los estados de México y la población total de 15 a 59 años de edad (2014).

with open("../../datos/estados.geojson", "r") as archivo:
    datos = json.load(archivo)

Puedes explorar el GeoJSON como explorariamos cualquier otro objeto JSON. GeoJSON es un formato estándar para codificar estructuras de datos geográficas. La estructura básica de un GeoJSON es asi:

{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [125.6, 10.1]
  },
  "properties": {
    "name": "Dinagat Islands"
  }
}

GeoJSON admite los siguientes tipos de geometría: Point, LineString, Polygon, MultiPoint, MultiLineString y MultiPolygon. Los objetos geométricos con propiedades adicionales son objetos Feature. Los conjuntos de características están contenidos en los objetos FeatureCollection

Estos son las características de este GeoJSON:

for key in datos['features'][1]['properties'].keys():
    print(key)
Entidad
OBJECTID_1
poblacion
abbrev
adm0_a3
adm0_label
adm0_sr
adm1_cod_1
adm1_code
admin
area_sqkm
centroid_lat
centroid_lon
check_me
code_hasc
code_local
datarank
diss_me
featurecla
fips
fips_alt
gadm_level
geonunit
gn_a1_code
gn_id
gn_level
gn_name
gn_region
gns_adm1
gns_id
gns_lang
gns_level
gns_name
gns_region
gu_a3
hasc_maybe
iso_3166_2
iso_a2
labelrank
latitude
longitude
mapcolor13
mapcolor9
name
name_alt
name_len
name_local
note
postal
provnum_ne
region
region_cod
region_sub
sameascity
scalerank
sov_a3
sub_code
type
type_en
wikipedia
woe_id
woe_label
woe_name

Y los accesamos de la siguiente manera:

datos['features'][1]['properties']['name']
'Baja California Sur'

Visualización

Recuerda que altair acepta datos en 3 formatos: un DataFrame de pandas, un objeto de clase Data de altair, o un URL apuntando a JSON o CSV directos.

En este caso ya tenemos un GeoJSON descargado así que usaremos alt.Data para representar nuestros datos.

datos_altair = alt.Data(values = datos['features'])

type(datos_altair)
altair.vegalite.v2.schema.core.Data

Ahora si podemos crear un mapa utilizando nuestros datos ahora en formato altair Data.

alt.Chart(datos_altair).mark_geoshape()

png

Tada! Ahora, claro que para que se vea más como un mapa de los estados de México tenemos que configurarlo diferente. Dentro de todos los marcadores (.mark_****()) puedes especificar ciertos aspectos de tu marcador. En este caso, geoshape, queremos que se muestren las delineaciones de cada estado y se sombrée el área interior. Los argumentos para hacer esto son:

  • stroke: el color de la delineación
  • fill: el color del sombreado

y podemos agreagar strokeWidth para especificar el grosor de la delineación (en pixeles).

alt.Chart(datos_altair).mark_geoshape(stroke = 'black', strokeWidth=0.5, fill = 'lightgray')

png

Nota que en este caso no codificamos nada con .encode().

Un tipo de mapa común en la visualización de datos es un choropleth. Un choropleth es un mapa temático en el que las áreas están sombreadas o modeladas en proporción a la medición de la variable estadística que se muestra en el mapa, como la densidad de población o el ingreso per cápita.

# Poblacion total de 15 a 59 años (2014)
alt.Chart(datos_altair).mark_geoshape(stroke = 'black', fill = 'lightgray', strokeWidth=0.5).encode(
    color = 'properties.poblacion:Q',
)

png