Configuración y ajustes de los elementos que componen los mapas y gráficos

Los elementos que componen un grafico o mapa (titulo, subtitulo, leyenda, pie de pagina, etc) son esenciales para poder interpretar correctamente los datos. En ggplot() esto se puede configurar creando un “theme” propio para gráficos y mapas. A continuación se muestran 4 ejemplos de esto: dos sobre gráficos de barras y dos sobre mapas.

El primer paso es cargar las librerías necesarias: “tidyverse” y “sf”.

library(tidyverse)
library(sf)

Luego es necesario cargar el dataset seleccionado. En este caso, se utilizarán los radios censales de CABA.

radios <- st_read("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/informacion-censal-por-radio/CABA_rc.geojson")
Parte 1: Gráficos

A continuación mediante un gráfico de barras, se compara la población por comuna según Censo 2010 mostrando la composición interna de las mismas (por Barrio).

Con el siguiente código se evitará que los datos numéricos de los gráficos aparezcan en notación científica:

options(scipen=100)
ggplot(radios)+
  geom_bar(aes(x=COMUNA, weight=POBLACION, fill= BARRIO))+
  labs(title = "Población por Comuna y Barrio",
         subtitle = "Ciudad Autonoma de Buenos Aires",
         fill="Barrios",
         caption= "Fuente: Censo 2010",
         x="Comuna",
         y="Población total")+
  theme_light()

El gráfico de barras anterior no tiene una estética muy “amigable”. Por lo tanto, se creará un theme que mejore la visualización de los datos.

radios %>%
  mutate(COMUNA = fct_relevel(COMUNA, "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15")) %>% #Ordenamos las comunas en orden descendente
ggplot()+
  geom_bar(aes(x=COMUNA, weight=POBLACION, fill= BARRIO))+
  labs(title = "Población por Comuna y Barrio",
         subtitle = "Ciudad Autonoma de Buenos Aires",
         fill="Barrios",
         caption= "Fuente: Censo 2010",
          x="Comuna",
          y="Personas")+
  guides(fill=guide_legend(title.position = "top", nrow=8, ncol=6))+
  ylim(c(0, 250000))+ #ajustar límite del eje Y
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), #ajustar los margenes del gráfico
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), #fondo del gráfico
        panel.grid.major = element_line(size = 0.5, linetype = 'solid', colour = "gray80"), #lineas del gráfico
        panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "gray90"), #líneas auxiliares
        title=element_text(size=12, face = "bold"), #tamaño de titulo del mapa
        legend.key.size = unit(0.25, "cm"), #alto de cuadrados de referencia
        legend.key.width = unit(0.4,"cm"), #ancho de cuadrados de referencia 
        legend.position="bottom", #ubicacion de leyenda
        legend.direction = "horizontal", #dirección de la leyenda
        legend.title=element_text(size=8, face = "bold"), #tamaño de titulo de leyenda
        legend.text=element_text(size=6), #tamaño de texto de leyenda
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), #tamaño de nota al pie
        axis.title = element_text(colour = "gray35",size = 8), #tamaño y color de referencias de ejes X e Y
        axis.text.x = element_text(colour = "gray25",size = 6), #tamaño y color del texto de eje X
        axis.text.y = element_text(colour = "gray25",size = 6))+ #tamaño y color del texto de eje Y
        ggsave("grafico_barra_poblacion.jpg", width = 25, height = 10, units = "cm", dpi = 200, limitsize = TRUE) #guardar gráfico en jpg

A continuación en un gráfico se compara la superficie (km2) por barrio según el Censo 2010 mostrando a su vez, a que Comuna pertenece cada uno.

ggplot(radios)+
  geom_bar(aes(x=BARRIO, weight=AREA_KM2, fill= COMUNA))+
  labs(title = "Superficie por Barrio",
         subtitle = "Ciudad Autonoma de Buenos Aires",
         fill="Comunas",
         caption= "Fuente: Censo 2010",
          x="Barrio",
          y="Superficie (km²)")+
  theme_light()

Mejoramos la estética:

radios %>%
  mutate(COMUNA = fct_relevel(COMUNA, "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15")) %>% #Ordenamos las comunas en orden descendente
  group_by(BARRIO, COMUNA) %>%
  summarise(AREA_KM2=sum(AREA_KM2)) %>%
ggplot()+
  geom_bar(aes(x=reorder(BARRIO, -AREA_KM2), weight=AREA_KM2, fill= COMUNA))+
  labs(title = "Superficie por Barrio",
         subtitle = "Ciudad Autonoma de Buenos Aires",
         fill="Comunas",
         caption= "Fuente: Censo 2010",
          x="Barrio",
          y="Superficie (km²)")+
  scale_fill_manual(values = c("#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598",
                                "#abdda4","#66c2a5","#3288bd","#5e4fa2","#542788","#8073ac",
                                 "#b2abd2","#d8daeb"))+
  guides(fill=guide_legend(title.position = "top", nrow=1))+
  ylim(c(0, 18))+ #ajustar límite del eje Y
  theme(plot.margin = margin(0.25, 0.5, 0.25, 0.5, "cm"), #ajustar los margenes del gráfico
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), #fondo del gráfico
        panel.grid.major = element_line(size = 0.25, linetype = 'solid', colour = "gray80"), #lineas del gráfico
        panel.grid.minor = element_line(size = 0.25, linetype = 'solid', colour = "gray90"), #líneas auxiliares
        title=element_text(size=12, face = "bold"), #tamaño de titulo del mapa
        legend.key.size = unit(0.4, "cm"), #alto de cuadrados de referencia
        legend.key.width = unit(0.5,"cm"), #ancho de cuadrados de referencia 
        legend.position="top", #ubicacion de leyenda
        legend.direction = "horizontal", #dirección de la leyenda
        legend.title=element_text(size=10, face = "bold"), #tamaño de titulo de leyenda
        legend.text=element_text(size=8), #tamaño de texto de leyenda
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), #tamaño de nota al pie
        axis.title = element_text(colour = "gray35",size = 8), #tamaño y color de referencias de ejes X e Y
        axis.text.x = element_text(colour = "gray25",size = 6, angle = 90), #tamaño y color del texto de eje X
        axis.text.y = element_text(colour = "gray25",size = 6))+ #tamaño y color del texto de eje Y
        ggsave("grafico_barra_superficie.jpg", width = 25, height = 10, units = "cm", dpi = 200, limitsize = TRUE) #guardar gráfico en jpg

Parte 2: Mapas

Ahora vamos a utilizar ggplot() con geom_sf() para mapear información geográfica a partir de la variable categórica BARRIOS.

ggplot() +
  geom_sf(data = radios, aes(fill = BARRIO), color = NA) +
    labs(title = "Barrios de la Ciudad de Buenos Aires",
         fill = "Barrios",
         caption= "Fuente: Censo 2010")

Si bien el resultado es el que esperabamos de ggplpot(), la “estética” hace que la información sea difícil de comprender. A continuación vamos a ajustar esto:

ggplot() +
  geom_sf(data = radios, aes(fill = BARRIO), color = NA) +
    labs(title = "Barrios de la Ciudad de Buenos Aires",
         fill = "Barrios",
         caption= "Fuente: Censo 2010")+
  scale_fill_viridis_d(alpha = 0.9)+
  guides(fill=guide_legend(title.position = "top", ncol=2))+
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), #ajustar los margenes del gráfico
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), #fondo del gráfico
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), #lineas del gráfico
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), #líneas auxiliares
        title=element_text(size=12, face = "bold"), #tamaño de titulo del mapa
        legend.key.size = unit(0.3, "cm"), #alto de cuadrados de referencia
        legend.key.width = unit(0.4,"cm"), #ancho de cuadrados de referencia 
        legend.position="right", #ubicacion de leyenda
        legend.direction = "horizontal", #dirección de la leyenda
        legend.title=element_text(size=10, face = "bold"), #tamaño de titulo de leyenda
        legend.text=element_text(size=7), #tamaño de texto de leyenda
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), #tamaño de nota al pie
        axis.text = element_blank(), #texto eje X e Y
        axis.ticks = element_blank())+ #eje X e Y
        ggsave("mapa_barrios_poligonos.jpg", width = 25, height = 10, units = "cm", dpi = 200, limitsize = TRUE) #guardar mapa en jpg

Por último, vamos a mapear la variable numérica POBLACION.

radios %>%
  group_by(BARRIO) %>%
  summarise(POBLACION=sum(POBLACION))%>%
ggplot() +
  geom_sf(aes(fill = POBLACION), color = NA) +
    labs(title = "Barrios de la Ciudad de Buenos Aires",
         fill = "Población",
         caption= "Fuente: Censo 2010")

La visualización es buena porque no hay datos categóricos. Sin embargo, podríamos realizar algunos ajustes de la siguiente forma:

radios %>%
  group_by(BARRIO) %>%
  summarise(POBLACION=sum(POBLACION))%>%
ggplot() +
  geom_sf(aes(fill = POBLACION), color = NA) +
    labs(title = "Barrios de la Ciudad de Buenos Aires",
         fill = "Población",
         caption= "Fuente: Censo 2010")+
  scale_fill_gradient(low="lightgoldenrodyellow", high="deeppink4")+
  theme(plot.margin = margin(0.25, 0.1, 0.25, 0.1, "cm"), #ajustar los margenes del gráfico
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), #fondo del gráfico
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), #lineas del gráfico
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), #líneas auxiliares
        title=element_text(size=10, face = "bold"), #tamaño de titulo del mapa
        legend.key.size = unit(0.2, "cm"), #alto de rectangulo de referencia
        legend.key.width = unit(0.8,"cm"), #ancho de rectangulo de referencia 
        legend.position="bottom", #ubicacion de leyenda
        legend.direction = "horizontal", #dirección de la leyenda
        legend.title=element_text(size=8), #tamaño de titulo de leyenda
        legend.text=element_text(size=6), #tamaño de texto de leyenda
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), #tamaño de nota al pie
        axis.text = element_blank(), #texto eje X e Y
        axis.ticks = element_blank())+ #eje X e Y
        ggsave("mapa_barrios_poblacion.jpg", width = 25, height = 10, units = "cm", dpi = 200, limitsize = TRUE) #guardar mapa en jpg

Otra opción más “rebuscada” es hacer un mapa de comunas con etiqueta de nombres, flecha de norte y escala utilizando la librería ggspatial.

library(ggspatial)
comunas <- radios %>%
           mutate(COMUNA = fct_relevel(COMUNA, "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15")) %>%
           group_by(COMUNA) %>%
            summarise()
comunas_centroides <- sf::st_centroid(comunas)
comunas_centroides_xy <- as.data.frame(sf::st_coordinates(comunas_centroides))
comunas_centroides_xy$COMUNA <- comunas$COMUNA
ggplot() +
  geom_sf(data = comunas, aes(fill = COMUNA), color = NA) +
  geom_text(data = comunas_centroides_xy, aes(X, Y, label = COMUNA), colour = "black", size=4)+
  annotation_scale(location = "br", width_hint = 0.2)+ #asignar ubicacion y tamano de la referencia de escala
  annotation_north_arrow(location = "tr", which_north = "true", #asignar ubicacion y tamano del norte
                         pad_x = unit(0.4, "cm"), pad_y = unit(0.4, "cm"),
                         style = north_arrow_fancy_orienteering)+ #asignar tipo de flecha
    labs(title = "Comunas de la Ciudad de Buenos Aires",
         fill = "Comunas",
         caption= "Fuente: Censo 2010",
         x="",
         y="")+
  scale_fill_viridis_d(option="plasma", alpha = 0.9)+
  guides(fill=guide_legend(title.position = "top", ncol=1))+
  theme(plot.margin = margin(0.25, 1, 0.25, 0.1, "cm"), #ajustar los margenes del mapa
        panel.background = element_rect(fill = "gray100", colour = "gray100", size = 2, linetype = "solid"), #fondo del gráfico
        panel.grid.major = element_line(size = 0.5, linetype = "dashed", colour = "gray80"), #lineas del gráfico
        panel.grid.minor = element_line(size = 0.25, linetype = "dashed", colour = "gray90"), #líneas auxiliares
        title=element_text(size=12, face = "bold"), #tamaño de titulo del mapa
        legend.key.size = unit(0.3, "cm"), #alto de cuadrados de referencia
        legend.key.width = unit(0.4,"cm"), #ancho de cuadrados de referencia 
        legend.position="right", #ubicacion de leyenda
        legend.direction = "horizontal", #dirección de la leyenda
        legend.title=element_text(size=10, face = "bold"), #tamaño de titulo de leyenda
        legend.text=element_text(size=7), #tamaño de texto de leyenda
        plot.caption=element_text(face = "italic", colour = "gray35",size=6), #tamaño de nota al pie
        axis.text = element_blank(), #texto eje X e Y
        axis.ticks = element_blank())+ #eje X e Y
        ggsave("mapa_comunas_nombres.jpg", width = 25, height = 10, units = "cm", dpi = 200, limitsize = TRUE) #guardar mapa en jpg