Los elementos que acompañan un gráfico (titulo, subtitulo, leyenda, pie de pagina, texto en ejes x e y, fondo, cuadrícula, etc) son esenciales para poder comunicar e interpretar correctamente los datos.
Sin embargo, a la hora de utilizar ggplot()
, estos elementos de asignan por defecto y a veces pueden no se ajustarse a lo que realmente queremos o necesitamos mostrar. Pero no se preocupen porque esto tiene una solución: Podemos crear un theme o tema y personalizar sus componentes a nuestro gusto!
A continuación veremos 2 ejemplos de esto sobre gráficos de barras.
Pero antes que nada, activemos (e instalemos si no lo hicimos nunca) los paquetes tidyverse
y sf
:
#install.packages("tidyverse")
library(tidyverse)
#install.packages("sf")
library(sf)
Ahora si, como vamos a trabajar con el dataset espacial (formato .geojson) correspondiente a los información del censo 2010 de CABA, lo primero que tenemos que hacer es cargarlo y explorar su contenido:
radios <- st_read("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/informacion-censal-por-radio/CABA_rc.geojson")
head(radios)
## Simple feature collection with 6 features and 8 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -58.38593 ymin: -34.60846 xmax: -58.35054 ymax: -34.57865
## CRS: 4326
## RADIO_ID BARRIO COMUNA POBLACION VIVIENDAS HOGARES HOGARES_NBI
## 1 1_1_1 RETIRO 1 336 82 65 19
## 2 1_12_1 SAN NICOLAS 1 341 365 116 25
## 3 1_12_10 SAN NICOLAS 1 296 629 101 1
## 4 1_12_11 SAN NICOLAS 1 528 375 136 7
## 5 1_12_2 SAN NICOLAS 1 229 445 129 16
## 6 1_12_3 SAN NICOLAS 1 723 744 314 104
## AREA_KM2 geometry
## 1 1.79899705 MULTIPOLYGON (((-58.37189 -...
## 2 0.01856469 MULTIPOLYGON (((-58.38593 -...
## 3 0.04438025 MULTIPOLYGON (((-58.37879 -...
## 4 0.36634000 MULTIPOLYGON (((-58.36733 -...
## 5 0.01836301 MULTIPOLYGON (((-58.38454 -...
## 6 0.03672540 MULTIPOLYGON (((-58.38154 -...
Comencemos creando un gráfico de barras (geom_bar()
) que compare la población por Comuna según Censo 2010 y muestre 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))
Bueno, el gráfico de barras que realizamos no tiene una estética muy “amigable”, ¿No?. Esto ocurre porque al tener tantas categorías (48 barrios) asignadas al “fill”, la leyenda ocupa más del 50% del espacio. Pero también podemos observar que las comunas del eje X no están ordenadas en forma ascendente, sino que, al ser consideradas factor, se ordenaron alfabéticamente y quedó 1, 10, 11, 12, etc.
Por lo tanto, volvamos a haber el gráfico pero creando 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")) %>% #ordeno las Comunas
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
Mucho mejor, ¿No?
Ahora creemos un gráfico compare 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))
Y nuevamente, 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")) %>%
group_by(BARRIO, COMUNA) %>%
summarise(AREA_KM2=sum(AREA_KM2)) %>%
ungroup() %>%
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
## `summarise()` has grouped output by 'BARRIO'. You can override using the `.groups` argument.
¿Qué les pareció el resultado? La lectura de la información mejoró notablemente. Los invito a probar esto mismo en otros tipos de gráficos: puntos, histograma, cajas, etc.