Geolocalizando tweets con Python. Tutorial 3 y final.

Vuelvo con la tercera parte del tutorial sobre la visualización de los datos de twitter. Esta vez centrándome más en la muestra de éstos.
Como se había podido leer en los dos posts anteriores, contaba con gran cantidad de tweets. Unos 10.000 concretamente. Estos tweets son mostrados como datos puntuales por su respectivo par de coordenadas, y cuentan con varios atributos como el texto, la fecha de creación, etc.





A la hora de visualizarlos, tampoco he querido complicarme mucho la vida, he decidido hacer un mapa de calor, o heatmap que muestre de manera fácil dónde se han generado más tweets. Además, he decido utilizar un mapa dinámico con la API de CartoDB, ya que era algo que quería probar hace tiempo, pero no me había animado. Para realizar el mapa de calor tenía varias opciones. A grandes rasgos, hacerlo de manera ráster, o vectorial. Descarté la manera ráster porque es la más cmún de hacer este tipo de mapas, así como la que más recursos encontré en la red. Además, cabe decir que CartoDB te permite crear un mapa de calor ráster a partir de una capa de puntos de manera automática. Justo lo que quería hacer yo, vamos. Pero si lo hacía de esa manera, pues no había tutorial.
En cuanto a la manera vectorial, decidí excluir la malla rectangular por la misma razón. Por tanto utilicé una malla hexagonal, que resula más atractiva a la vista.
Por último, cabe decir que el software utilizado fue QGis, aunque CartoDB me simplificó mucho el trabajo.
Así pues, los pasos a seguir fueron:
  • Creación de la malla hexagonal (con QGis)
  • Selección de los puntos en la malla (Con QGis)
  • Reclasificación (Con CartoDB)
  • "Estilar" el mapa.

Creación de la malla hexagonal:

Este paso es súmamente fácil de hacer en QGis con el plugin mmqgis . Tan sólo hay que seguir unos pocos pasos muy intuitivos para crear la rejilla. Create> Grid > Hexagon (polygon) Y decirle la resolución queremos. Yo la hice de 150Km de lado (recordemos que es un mapa a escala mundial, esa resolución está bastante bien)

Selección de los puntos en la malla:

Este apartado es el más importante, pero no por ello es difícil. QGis tiene otra extensión que nos permite hacerlo con facilidad. Vectorial> Herramientas de análisis > Puntos en polígono. Esto abrirá una pequeña herramienta, en cuya ventana tan solo tendremos que seleccionar la capa de puntos (los tweets) y la capa de polígonos (la rejilla que acabamos de crear). También seleccionaremos el nombre del campo que almacenará los datos (puntos, por no complicarnos) y daremos una ruta para la creación de la nueva capa. El resultado será una nueva capa cuyos atributos serán tres campos: Longitud y Latitud, que será el par de coordenadas de la esquina superior izquierda del hexágono, y puntos, que, obviamente, será el número de puntos que contiene cada hexágono.
Hasta aquí la parte de QGis. Si bien, esta visualización se podría quedar "estática", es decir, podría utilizarse para un mapa impreso. Si así fuera, sólo tendríamos que reclasificar esta capa, para mostrar los datos numéricos (el número de puntos) como una rampa de color. Para esto, en QGis iríamos al menú de propiedades, y escogeríamos dentro de la pestaña "Estilo", la opción "Graduado" Pero este paso lo vamos a hacer con CartoDB, ya que lo permite de una manera muy sencilla.

Exportamos la capa:

CartoDB permite diversos formatos de importación, yo he escogido el GeoJSON porque es el que menos me ocupaba.
Una vez importada la capa a CartoDB, todo es coser y cantar. Veremos nuestra tabla o mapa, según elijamos la pestaña, y veremos cómo las opciones son tan intuitivas que no hace falta ni explicar aquí. Tan sólo nos quedará hacer el paso que he dicho anteriormente.

Reclasificación en CartoDB:

La reclasificación en CartoDB es igual de sencilla que en QGis, pero nos da menos opciones (aunque tocando un poco de código se puede solucionar) En la vista de mapa, entraremos en Wizards, a la derecha, y seleccionaremos "choropleth" Esto significa que remos hacer un mapa temático con los valores que coja de una tabla. Bien, la tabla ya la tenemos (solo tenemos una) tendremos que decirle la columna que los contiene. En mi caso la he llamado puntos. Así, esto estilará el mapa según tenga uno u otro valor en la columna. ¿Qué significa esto? Pues que "pintará" el polígono (hexágono) de uno u otro color según tenga más o menos puntos dentro.

Estilar el mapa:

Si seguimos bajando, vamos viendo las opciones: "Buckets" hará referencia al numero de clasificaciones que queremos, esto es lo que está limitado a 3, 5 ó 7. Yo he escogido 7. Mientras que la cuantificación será el tipo de "separación" que queremos que haga. Es decir, si queremos que lo separe en intervalos iguales, o siga algún patrón. Como yo quería una clasificación propia, lo que he ha sido modificarlo manualmente. Para ello he ido al menú de abajo que se llama CSS y he modificado el código, dejándolo así:
/** choropleth visualization */

#tweets_en_espa_ol{
  line-color: #FFF;
  line-opacity: 1;
  line-width: 1.5;
  polygon-opacity: 0.9;
  polygon-comp-op: lighten;
}
#tweets_en_espa_ol [ puntos <= 1000.0] {
   polygon-fill: #B10026;
}
#tweets_en_espa_ol [ puntos <= 200.0] {
   polygon-fill: #E31A1C;
}
#tweets_en_espa_ol [ puntos <= 150.0] {
   polygon-fill: #FC4E2A;
}
#tweets_en_espa_ol [ puntos <= 100.0] {
   polygon-fill: #FD8D3C;
}
#tweets_en_espa_ol [ puntos <= 50.0] {
   polygon-fill: #FEB24C;
}
#tweets_en_espa_ol [ puntos <= 20.0] {
   polygon-fill: #FED976;
}
#tweets_en_espa_ol [ puntos <= 10.0] {
   polygon-fill: #FFFFB2;
}
Como decía, si modificáis el número de puntos, obtendréis una reclasificación nueva, y si añadís una linea, obtendréis un valor más para clasificar, por ejemplo:
     #tweets_en_espa_ol [ puntos <= 15.0] {
   polygon-fill: #FFFFB2;
Añadiría otra clasificación a la rampa de color elegida. Osea, que pintaría de el color elegido (#FFFFB2;) los polígonos que tuvieran entre 10 y 15 puntos en su interior.
Bien, con todo esto, tan solo nos queda exportar el mapa. Esto lo conseguimos con el botón de "Share", y tenemos tres opciones. URL: Por si queremos pegarla en algún sitio. EMBED: Que nos generará una etiqueta de <iframe>para pegarla en nuestro código HTML (es el que he utilizado yo) API: Que será la URL que necesitaremos si estamos trabajando con mapas propios bajo la API de CartoDB con Javascript. Espero algún día tener tiempo para investigarla.
Y hasta aquí el artículo de hoy. Si alguien lee esto y quiere dejar un comentario (abre el post para que salga la caja), le animo a que lo haga. Si no, en el about está mi email, siempre contesto :)

1 comentario:

  1. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar