Uso de VegaLite para visualizar mapas

Tabla de contenidos

Introducción

Como lo prometimos en la entrada previa, vamos a profundizar una de las herramientas de Julia para generar gráficos, el mismo que esta presente como parte del paquete Queryverse, nos referimos a VegaLite.jl. Con el objetivo de mostrar todo el camino seguido para lograr nuestros resultados, voy a iniciar planteando el reto de generar mapas empleando VegaLite y algunos paquetes ya vistos previamente, de la misma manera, asumo que mi fuente de datos lo conforman dos capas de datos vectoriales, una de los límites distritales del Departamento de Huánuco en Perú (polígono) y otra de centros poblados (puntos) presentes en el mismo ámbito. Por otro lado, a diferencia de la última entrega, ahora vamos a elaborar un notebook con Pluto, con la finalidad de hacerlo digamos más interactivo.

Características Principales del VegaLite.jl

El paquete se basa en Vega-Lite, que extiende una gramática tradicional de API de gráficos a una gramática de gráficos interactivos (preimpresión). Junto con Vega-Lite, hay soporte básico para gráficos Vega. Como lo menciona su documentación, VegaLite.jl le permite crear una amplia gama de gráficos estadísticos. Expone la funcionalidad completa del Vega-Lite subyacente y, al mismo tiempo, está estrechamente integrado en el ecosistema de Julia.

Una de las principales diferencias al usar Vega-Lite es contar con una sintaxis JSON declarativa y concisa para crear una gama expresiva de visualizaciones para el análisis y la presentación de datos. Las especificaciones de Vega-Lite describen visualizaciones como asignaciones de codificación de datos a propiedades de marcas gráficas – Mark (por ejemplo, puntos o barras). Vega-Lite esta diseñado para admitir el análisis de datos, por lo tanto, admite tanto transformaciones de datos (por ejemplo, agregación, agrupamiento, filtrado, clasificación) como transformaciones visuales (por ejemplo, apilamiento y facetado). Además, las especificaciones de Vega-Lite se pueden componer en pantallas en capas y multivista, e interactuar con las selecciones [1].

Procedimiento:

Fuente de Datos

Como lo mencionamos, partiremos de dos capas de tipo vectorial, una de polígonos (dist_huanucof.geojson)y otra de puntos (ccpp_huanuco.gpkg). Nos apoyaremos del software QGIS para preparar nuestros datos y pueden ser empleados con el paquete VegaLite.jl.

Fig. 1: Fuente de datos

El paso siguiente fue convertir nuestra capa de polígonos en un formato de tipo topojson, siendo uno de los formatos que nos permite trabajar como fuente de datos en Vega-Lite [2]. Para lograrlo vamos a usar un Plugin de QGIS denominado TopoJSON Writer, con la finalidad de tener nuestro archivo con el formato requerido.

Fig.2: Uso del plugin TopoJSON Writer

Luego, nuestra capa de centros poblados que está en formato Geopackage, debemos exportarlo a un formato CSV, para lograrlo simplemente lo hacemos en QGIS seleccionándolo desde el panel de capas y activamos la herramienta de Exportar–> Guardar objetos como…, en la próxima vista en la opción de Formato, seleccionamos CSV.

Uso de Pluto

En mi canal se elaboró un video sobre lo básico de Pluto, por lo tanto, voy asumir que conocen algo sobre como trabajar Notebooks con Pluto, entonces comencemos con el código en Julia, primero activamos Pluto con using Pluto y luego Pluto.run().

fig.3: Vista de Pluto con las primeras celdas

Como se aprecia lo que quiero resaltar en esta primera vista, es que luego de tener nuestra capa que fue convertida a un formato topojson, se debe editar la extensión a json. Es importante mencionar que en los ejemplos de la documentación oficial, la fuente de datos que emplean son extraídos desde una lista que están disponibles de forma directa usando el paquete VegaDatasets. Pero nuestro objetivo fue que VegaLite pueda leer nuestro capa en formato topojson, para ello, revisando posibles ayudas en la red, encontré una solución desde un foro de Julia y la puse en práctica. Como podemos ver, tuve que emplear el paquete JSON, luego como se puede ver, nuestro archivo ya fue reconocido como un VegaJSONDataset.

Generando los primeros gráficos con VegaLite

Ahora que contamos con nuestra fuente de datos en el formato que lo puede reconocer VegaLite, iniciamos una sintaxis relativamente sencilla para generar nuestro primer gráfico. El reto era mostrar el mapa de los Distritos del Departamento de Huánuco.

fig. 4: Primer mapa generado con VegaLite

De lo que podemos apreciar en el código, resalto el hecho que como lo mencionamos en las características del Vega-Lite, podemos definir una «marca gráfica» a representar (Mark), para nuestro caso es Geoshape, la cual representa formas arbitrarias cuya geometría está determinada por datos de formas GeoJSON especificados que se proyectan desde coordenadas geográficas a píxeles. Luego existen indicaciones para incluir título y también para definir las dimensiones de nuestro «lienzo» con width y height. Ahora un punto sensible es cuando debemos indicar la data que debe considerar, en este caso como se aprecia en la fig. 3, el objeto «d» corresponde a nuestra capa de polígonos y que corresponde a un formato topojson. En el caso de feature, si abrimos nuestro archivo convertido, podemos apreciarlo, siendo representado por el objeto que presenta un tipo de geometría (multipolígono).

fig.5: Identificación de la propiedad feature.

Como se trata de datos geoespaciales, debemos definir el sistema de referencia o proyección. Una lista de valores en relación al tipo que debemos emplear lo pueden revisar aquí. En nuestro caso empleamos el denominado «Mercator«.

Para hacerlo más interesante, vamos a incluir los datos de centros poblamos a nuestro mapa, por lo tanto, necesitamos preparar los datos para ser empleados con VegaLite. En este caso estamos empleando las funciones que viene incluida en el paquete CSVFiles.

fig.6: Uso del paquete CSVFiles para abrir un archivo delimitado por comas.

Ahora vamos a generar un mapa con los distritos juntos a los centros poblados.

fig.7: Mapa integrando dos capas de datos vectoriales, límite distrital y centros poblados

Como se aprecia en el código, vemos que podemos dividirlo para contar con una sintaxis más fluida, luego lo podemos unir con «+«, pero lo importante aquí es que además de la marca Geoshape, ahora hemos agregado la marca Circle, indicando que la fuente se refiere a la capa de centros poblados (puntos) que fue definida según lo visto en la fig.6. Por lo tanto, es importante indicarle los campos en donde se encuentras las coordenadas que representan dichos puntos, la indicación «:q«, se refiere a valores cuantitativos (quantitative). Luego se aprecia algunas propiedades relacionadas a temas de estilos.

Aplicando filtros para ser integrado a nuestro mapa

Ahora necesitamos integrar otros datos que sean extraídos de nuestras propias fuentes, para ello vamos a usar filtros gracias a las funciones disponibles en el paquete Query.jl.

fig.8: Uso de filtros empleando el paquete Query.

Ahora podemos definir nuestro objeto que será empleado en nuestro próximo mapa.

fig.9: Vista de los campos de datos como resultado de aplicar filtros.

Finalmente vamos a generar un mapa con todo lo que tenemos hasta ahora.

fig.10: Definición de propiedades más avanzadas a nuestro mapa.

Se presenta la parte del código que fue modificada para obtener nuestro resultado final. Como podemos ver, en esta oportunidad primero estamos coloreando los centros poblados en función a la provincia que pertenecen (ver la propiedad de color), luego vamos a incluir una leyenda en función para ver los nombres y los colores que fueron empleados. Seguidamente apreciamos que para nuestros datos filtrados (cp_cap), vamos a representarlos en función a sus valores cuantitativos de población y relacionados a la propiedad de tamaño (Size), es decir a mayor población el punto tendrá un mayor «tamaño» y todos ellos de color rojo. Al final también decidimos incluir etiquetas, para ello usamos la marca Text, y como se puede apreciar se incluye diversas propiedades para contar con una mejor visualización. El resultado se aprecia en la siguiente figura:

fig.11: Vista del mapa final elaborado con VegaLite

Para poder incluir nuestro mapa en algún informe o presentación podemos guardarlo en un formato de imagen. Empleando la función save se guardó en formato SVG para tener una mejor calidad de visualización de nuestro mapa.

fig.12: Guardando nuestro mapa en formato SVG.

Reflexión Final

En Julia tenemos muchas opciones para generar gráficos, VegaLite nos muestra quizás una de las maneras más distintas pero potente para ser trabajado. Reconozco que al comienzo fue complicado entender la sintaxis, pero nada como la práctica para irse familiarizando, en especial porque podemos tener una gráfico de manera simple en pocas líneas y si seguimos una estructura de manera ordenada podemos ir subiendo en complejidad pero a su vez un gráfico mucho mejor elaborado. No quiero dejar de mencionar que todo el código lo pudimos ejecutar instalando solamente los paquetes de Queryverse y JSON, pero quise mostrarles los paquetes de manera individual para que lo vayan conociendo a mayor profundidad, sobre todo sus utilidades específicas.

Bueno, espero que haya contribuido en el conocimiento de éstas herramientas, aunque no tengo pensado cual sería mi próxima entrada, estoy seguro que buscaré que sea alguna herramienta que sea de mucha utilidad. Todo los datos para que puedan reproducirlo esta en un repositorio que fue creado para este ejemplo (https://github.com/ccarbajal16/vegalite_pluto ). Hasta la próxima.


[1] https://vega.github.io/vega-lite/
[2] https://vega.github.io/vega-lite/docs/data.html

Un comentario en “Uso de VegaLite para visualizar mapas”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *