if (!"dplyr" %in% installed.packages()) install.packages("dplyr") # transformar datos
if (!"readr" %in% installed.packages()) install.packages("readr") # leer datos
if (!"ggplot2" %in% installed.packages()) install.packages("ggplot") # gráficas
if (!"ggthemes" %in% installed.packages()) install.packages("ggthemes") # themes
if (!"rgdal" %in% installed.packages()) install.packages("rgdal") # para leer todo tipo de ficheros spaciales
if (!"mapproj" %in% installed.packages()) install.packages("mapproj") # para leer todo tipo de ficheros spaciales
if (!"leaflet" %in% installed.packages()) install.packages("leaflet") #  para dibujar mapas interactivos
if (!"leaflet" %in% installed.packages()) install.packages("leaflet") #  para dibujar mapas interactivos

library(dplyr)
library(readr)
library(ggplot2)
library(rgdal) # Libería para leer mapas externos en objetos sp
library(leaflet) # Mapas interactivos
library(ggthemes) # Themes
library(mapproj) # Proyección de coordenadas

Mapa

Datos obtenidos de los tweets de los usuarios que se quejan del Metro de Madrid

Recursos de geolocalización

  • Fichero de las líneas del metro (formato KLM): recurso obtenido vía @adelgado
  • Fichero con las quejas geolocalizadas: datos procesados de los tweets en los que se identificó el nombre de una estación de metro. Se ha añadido la geolocalización de las estaciones con un recurso del portal del consorcio de Transportes Madrid
lineas_metro_file <- "https://congosto.github.io/mapas/lineas_metro.kml"
quejas_metro_file <- "https://congosto.github.io/datos/metro_madrid_quejas_por_estacion_totales.csv"

Leemos datos

  • El recurso KML solo se puede leer con readOGR y obtendremos un objeto sp
  • El recurso de las quejas se lee como csv. Aunque tiene información de localización no está en un formato espacial
lineas_metro <- readOGR(lineas_metro_file, use_iconv=TRUE, encoding= "UTF-8")
## OGR data source with driver: KML 
## Source: "https://congosto.github.io/mapas/lineas_metro.kml", layer: "lineas metro"
## with 13 features
## It has 2 fields
print (lineas_metro@data)
##    Name
## 0    L1
## 1    L2
## 2    L3
## 3    L4
## 4    L5
## 5    L6
## 6    L7
## 7    L8
## 8    L9
## 9   L10
## 10  L11
## 11  L12
## 12    R
##                                                                          Description
## 0   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L1 </div>
## 1   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L2 </div>
## 2   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L3 </div>
## 3   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L4 </div>
## 4   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L5 </div>
## 5   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L6 </div>
## 6   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L7 </div>
## 7   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L8 </div>
## 8   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L9 </div>
## 9  <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L10 </div>
## 10 <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L11 </div>
## 11 <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> L12 </div>
## 12   <div class="googft-info-window"> <b>description:</b> <br> <b>name:</b> R </div>
quejas_metro <- read_csv2(quejas_metro_file)
print (quejas_metro)
## # A tibble: 1,142 x 6
##    Latitude Longitude Line  Station            Complaint Num_complaints
##       <dbl>     <dbl> <chr> <chr>              <chr>              <dbl>
##  1     40.4     -3.72 6     moncloa            Accesos              555
##  2     40.4     -3.70 6     legazpi            Accesos              531
##  3     40.4     -3.71 5     la latina          Accesos              419
##  4     40.4     -3.67 6     pacifico           Accesos              401
##  5     40.4     -3.70 3     lavapies           Accesos              398
##  6     40.4     -3.69 8     nuevos ministerios Accesos              348
##  7     40.4     -3.70 3     sol                Accesos              326
##  8     40.4     -3.70 7     canal              Accesos              310
##  9     40.4     -3.73 6     oporto             Accesos              306
## 10     40.4     -3.71 5     callao             Accesos              304
## # ... with 1,132 more rows

Mapa con ggplot

  • Hay que convertirlo de sp a su formato de puntos
  • No es necesario unir el fichero espacial y el de datos
  • Hay que ajustar color de las líneas del metro para que se correspondan con la realidad
  • Hay que ajustar los colores de las quejas para que se vean con claridad los puntos superpuestos
  • Le ponemos fondo negro para resaltar mejor los símbolos
  • Tenemos que resolver un problema con la leyenda. Al hacer el color manual nos aparecerán los tanto las líneas como las quejas. Con breaks=quejas solo aparecerán las quejas
color_manual <- c ("0" = "cyan",
                   "1" = "red",
                   "2" = "yellow",
                   "3" = "brown",
                   "4" = "chartreuse",
                   "5" = "grey",
                   "6" = "orange",
                   "7" = "violet",
                   "8" = "purple",
                   "9" = "darkblue",
                   "10" = "darkgreen",
                   "11" = "darkgoldenrod3",
                   "12" = "black",
                   "Accesos" = "cyan",
                   "Aglomeración" = "chartreuse",
                   "Avería" = "red",
                   "Calor" = "yellow",
                   "Controles" = "purple",
                   "Inundación" = "blue",
                   "Lento" = "orange",
                   "Olor" = "green",
                   "Precio" = "grey",
                   "Suciedad" =  "brown")

quejas = c("Accesos", "Aglomeración", "Avería", "Calor", "Controles", "Inundación",
          "Lento", "Olor", "Precio", "Suciedad")


lineas_metro_points <- fortify(lineas_metro, region="Name")
head (lineas_metro_points)
##        long      lat order piece id group
## 1 -3.591903 40.36003     1     1  0   0.1
## 2 -3.600179 40.36410     2     1  0   0.1
## 3 -3.610633 40.36923     3     1  0   0.1
## 4 -3.612232 40.36962     4     1  0   0.1
## 5 -3.614003 40.36966     5     1  0   0.1
## 6 -3.615295 40.36936     6     1  0   0.1
ggplot () +
  geom_path(data = lineas_metro_points, aes( x = long, y = lat, group = group, color =id),
            size = 1, show.legend = FALSE) +
  coord_map("mercator") +
  geom_point (data = quejas_metro, aes ( x = Longitude, y = Latitude,
                                         size =  Num_complaints,
                                         color = Complaint)) +
  scale_color_manual (name = "Quejas", values = color_manual, breaks=quejas) +
  labs (title ="Quejas de los usuarios del metro de Madrid") +
  theme_map() +
  theme(plot.background = element_rect(fill = "black"),
        title = element_text(color="white", size = 16),
        legend.text = element_text(size = 10),
        legend.position = "right")

Mapa con leaflet

  • Trabaja directamente en sp
  • No es necesario unir el fichero espacial y el de datos porque en cada operacion le damos el dataframe que debe usar
  • Funciona añadiendo capas al mapa
  • Hay que ajustar color de las líneas del metro para que se correspondan con la realidad
  • Hay que ajustar los colores de las quejas para que se vean con claridad los puntos superpuestos
  • Le ponemos fondo negro para resaltar mejor los símbolos
  • No tenemos el problema con la leyenda
  • Le añadimos un tooltip
if (!"htmltools" %in% installed.packages()) install.packages("htmltools") # transformar datos
library(htmltools)
color_lineas <- c ( "cyan",
                    "red",
                    "yellow",
                    "brown",
                    "chartreuse",
                    "grey",
                    "orange",
                    "violet",
                    "purple",
                    "darkblue",
                    "darkgreen",
                    "darkorange")  

color_quejas <- c ("cyan",
                    "chartreuse",
                    "red",
                    "yellow",
                    "purple",
                    "blue",
                    "orange",
                    "green",
                    "grey",
                    "brown")


leaflet(lineas_metro) %>% 
  setView( -3.7030258, 40.4167428, zoom = 12) %>%
  addProviderTiles(providers$CartoDB.DarkMatter) %>%
  addPolylines (color = color_lineas) %>%
  addCircleMarkers (lng = quejas_metro$Longitude, lat = quejas_metro$Latitude,
                    radius = ifelse(quejas_metro$Num_complaints >300, 8,
                                    ifelse ( quejas_metro$Num_complaints >100, 6,
                                             ifelse (quejas_metro$Num_complaints > 50, 4,2))),
                    color = color_quejas,
                    label = ~htmlEscape(paste (quejas_metro$Station,"\n",
                                               quejas_metro$Complaint,"\n",
                                               quejas_metro$Num_complaints, "\n"))) %>%
  addLegend( position = "topright",
             colors = color_quejas,
             labels = quejas)