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")
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
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