ANÁLISIS Y VISUALIZACIÓN DE DATOS

Hasta acá ya sabemos abrir, explorar, manipular y transformar un dataset, así que ahora nos enfocaremos en el desarrollo de visualizaciones que nos permitirán comunicar de forma gráfica lo que dicen nuestros datos.

Para esto utilizaremos nuevamente la librería tidyverse, que incluye diversos paquetes, entre los que se encuentra ggplot2, que resulta muy útil a la hora de realizar diferentes tipos de gráficos a partir de las variables/columnas que tengamos en nuestra data.

Cabe destacar que, si bien existen muchos tipos de gráficos, cada uno tiene un objetivo diferente y que sean comprensibles, depende de haber hecho previamente una “buena” selección de variables a graficar. Es decir que, según la información que se quiera mostrar, va a haber un gráfico que se adapte mejor y pueda expresar/comunicar de mejor modo los resultados.

Para conocer más sobre esto, les recomiendo que naveguen por la página Data to Viz y vean cuales son los diferentes tipos de gráficos que existen y a partir de que tipos de variables se conforman:

Pero volviendo al contenido de la clase, lo que hoy aprenderemos es a representar gráficamente los siguientes ítems:

  • Distribución de una variable continua: Histograma

  • Relación entre variables continuas: Gráfico de puntos

  • Relación entre una variable continua y una categórica: Gráfico de barras

Carga y exploración del dataset

A continuación trabajaremos con los datos de Properati, un portal web de compra, venta y alquiler de inmuebles en toda América Latina. Estos datos son públicos y pueden encontrarlos en el siguiente link.

En este caso, para facilitar la manipulación de la información durante la clase, usaremos un set de datos (en formato .csv) previamente procesado que contiene datos de propiedades publicadas en AMBA en Mayo y Junio de 2021. Pueden descargarlo de este link.

Recomendación: Al descargarlo, moverlo de la carpeta “Descargas” a la carpeta llamada “data” dentro de la carpeta del Proyecto donde estén trabajando.

Ahora si, ¡Manos a la obra! Carguemos nuestro dataset:

datos_amba <- read.csv("data/amba_properati2021.csv", stringsAsFactors = TRUE)

Revisemos cuantos registros y variables tiene:

dim(datos_amba)
## [1] 19279    13

Nuestra base cuenta con 19.279 registros y 13 columnas. Veamos que información contiene:

names(datos_amba)
##  [1] "created_on"      "provincia"       "partido"         "rooms"          
##  [5] "surface_total"   "surface_covered" "price"           "currency"       
##  [9] "title"           "property_type"   "operation_type"  "lat"            
## [13] "lon"

Bien, las columnas tienen fecha de publicación de la propiedad, provincia y partido donde se ubica, cantidad de ambientes, superficie total y superficie cubierta, precio publicado, tipo de moneda (ARS o USD), el título que el usuario escribió al publicar su propiedad, el tipo de propiedad, el tipo de operación, y finalmente la ubicación del inmueble con sus coordenadas: latitud y longitud.

Veamos un resumen de nuestros datos:

summary(datos_amba)
##    created_on     provincia         partido          rooms       
##  Min.   :202105   CABA:10303   Comuna 14: 1781   Min.   : 1.000  
##  1st Qu.:202105   GBA : 8976   Comuna 13: 1431   1st Qu.: 2.000  
##  Median :202105                La Plata : 1263   Median : 3.000  
##  Mean   :202105                Comuna 1 : 1036   Mean   : 3.201  
##  3rd Qu.:202106                Comuna 2 :  927   3rd Qu.: 4.000  
##  Max.   :202106                Comuna 12:  882   Max.   :10.000  
##                                (Other)  :11959                   
##  surface_total    surface_covered      price         currency   
##  Min.   :  14.0   Min.   : 14.00   Min.   :  10000   ARS: 2977  
##  1st Qu.:  51.0   1st Qu.: 46.00   1st Qu.:  75000   USD:16302  
##  Median :  77.0   Median : 67.00   Median : 129900              
##  Mean   : 118.5   Mean   : 95.28   Mean   : 190626              
##  3rd Qu.: 140.0   3rd Qu.:114.00   3rd Qu.: 220000              
##  Max.   :4400.0   Max.   :890.00   Max.   :2950000              
##                                                                 
##                       title            property_type    operation_type 
##  Departamento - Recoleta :  136   Casa        : 4477   Alquiler: 2977  
##  Departamento - Belgrano :  135   Departamento:12756   Venta   :16302  
##  Departamento - Caballito:  124   PH          : 2046                   
##  Departamento - Palermo  :  123                                        
##  Departamento - La Plata :  111                                        
##  Departamento - Almagro  :   75                                        
##  (Other)                 :18575                                        
##       lat              lon        
##  Min.   :-35.12   Min.   :-59.02  
##  1st Qu.:-34.64   1st Qu.:-58.53  
##  Median :-34.60   Median :-58.46  
##  Mean   :-34.61   Mean   :-58.46  
##  3rd Qu.:-34.56   3rd Qu.:-58.40  
##  Max.   :-34.15   Max.   :-57.85  
## 

Ya podemos ir generando algunos insights:

  • Del total de publicaciones, la mayoría se ubican en CABA (10.303).

  • La Comuna con más propiedades publicadas es la 14, seguida por la 13.

  • La propiedad de menor superficie cubierta tiene 14 m2 y la de mayor tiene 890 m2.

  • La mayoría de las propiedades fueron registradas a la venta (16.302).

  • La mayoría de las propiedades publicadas son departamentos.

Ya estamos en condiciones de hacer nuestros primeros gráficos, y para esto activemos la librería tidyverse:

library(tidyverse)

Pero antes de comenzar a desarrollar nuestras visualizaciones, veamos que parámetros son los que componen la estructura del código necesario para realizar un gráfico con ggplot2:

  • Dataset a utilizar: indicar el dataset al inicio del código en ggplot(dataset).

  • Tipo de Gráfico a realizar: puede ser de puntos, barras, líneas, áreas, matriz, histograma, densidad, etc. Estos elementos funcionan como “capas” ya que pueden utilizarse más de uno a la vez en un mismo gráfico y sus códigos se escriben geom_hist(), geom_point(), geom_bar(), etc.

  • Atributos Estéticos que dependen de una o más columnas del dataset: variables a utilizar en ejes x e y, colores, tamaños, formas, etc. Siempre se asignan dentro de aes().

A su vez, de forma opcional también se pueden sumar:

  • Etiquetas que ayudan a la interpretación de las visualizaciones. Estas son: títulos, subtítulos, leyendas, etc. Se asignan dentro de labs().

  • Facetas a utilizar: de acuerdo a alguna columna del dataset dividen el gráfico manteniendo las escalas. Se logra con facet_grid().

  • Temas que permiten elegir la estética general del gráfico (color de fondo, tamaño de márgenes, etc). Algunos son theme_void(), theme_dark(), etc.

Ahora sí, ¡Comencemos!

Distribución de una variable continua: Histograma

Los histogramas muestran gráficamente, a partir de barras, la distribución de una variable continua, es decir la frecuencia con la que aparece cada valor numérico en una determinada columna del dataset. En el eje X se representa la variable continua y en el eje Y la frecuencia de la misma.

Por lo tanto, aquí tenemos que elegir una sola variable de nuestro dataset que irá en el eje X, y R hará los conteos necesarios para completar el gráfico en el eje Y.

Para generar este tipo de visualización utilizaremos ggplot() + geom_histogram(). Veamos por ejemplo como se distribuye la variable surface_covered en la base de datos:

ggplot(datos_amba)+
  geom_histogram(aes(x=surface_covered))

El eje X muestra la cantidad de m2 cubiertos que tienen las propiedades publicadas y el eje Y la cantidad de veces que aparece cada superficie. Por lo tanto, podemos ver que hay muchas propiedades con “poca” superficie cubierta y pocas propiedades con “mucha” superficie cubierta.

Para facilitar la interpretación, podemos modificar el ancho de las barras (bins) que por defecto el valor es 30. Probemos con bins=75:

ggplot(datos_amba)+
  geom_histogram(aes(x=surface_covered), bins=75)

¿Notan el cambio? El eje Y disminuyó porque los conteos se agruparon en intervalos más pequeños sobre el eje X.

Podemos observar que hay más propiedades por debajo de los 100 m2 cubiertos que por encima, y que la mayor cantidad de observaciones se ubica alrededor de los 50 m2. También podemos detectar algunos outliers que tienen más de 600 m2.

Agreguemos mayor información al gráfico e incorporemos una variable más (provincia) que nos permita comprender si los comportamientos de la variable surface_covered cambian entre CABA y PBA. En este caso la agregaremos como un color de relleno (fill):

ggplot(datos_amba)+
  geom_histogram(aes(x=surface_covered, fill=provincia), bins=75)

Está claro que, si bien en ambas zonas la mayoría de las propiedades tiene alrededor de 50 m2, en CABA la cantidad es superior que en GBA. A diferencia de las propiedades con más de 250 m2 que se ve que predominan en GBA.

Ahora probemos agregar etiquetas (labs) y elijamos los colores del gráfico (scale_fill y theme).

Cabe destacar que hay 2 tipos de escalas de color:

  • Las ya establecidas (listas para usar): Brewer, Viridis. Recomiendo utilizar estas que en ggplot2 las van a encontrar como scale_fill_viridis_c(), scale_fill_brewer(), scale_color_distiller() y demás variantes.

  • Las personalizadas, donde nosotros elegimos todos los colores: Gradiente (scale_fill_gradient()), Manual (scale_fill_manual()) Para obtener un listado de colores pueden ver este link o bien utilizar los códigos HEX clásicos

ggplot(datos_amba)+
  geom_histogram(aes(x=surface_covered, fill=provincia), bins=75)+
  labs(title="Superficie cubierta de publicaciones",
       fill="Zona",
       x="Superficie cubierta (M2)",
       y="Cantidad",
       caption="Fuente: Properati Mayo y Junio 2021")+
  scale_fill_manual(values = c("goldenrod2", "indianred2"))+
  theme_bw()

Pero todavía podemos desagregar aún más nuestros datos sumando una variable categórica (tipo de operación) que nos permita facetar/dividir el gráfico. Para esto utilizaremos facet_grid():

ggplot(datos_amba)+
  geom_histogram(aes(x=surface_covered, fill=provincia), bins=75)+
  labs(title="Superficie cubierta de publicaciones",
       fill="Zona",
       x="Superficie cubierta (M2)",
       y="Cantidad",
       caption="Fuente: Properati Mayo y Junio 2021")+
  scale_fill_manual(values = c("goldenrod2", "indianred2"))+
  theme_bw()+
  facet_grid(~operation_type)

La tendencia se mantiene similar en ambos casos, con una mayoría de propiedades de aprox. 50 m2 cubiertos. Sin embargo, se detecta una gran diferencia en la cantidad de propiedades publicadas para cada tipo de operación.

Relación entre variables numéricas: Gráfico de Dispersión

Ahora veamos el clásico gráfico de puntos o scatter plot que muestra la dispersión que existe entre 2 variables numéricas representadas en los 2 ejes X e Y, y que permite identificar si existe o no una relación entre ambas.

Veamos por ejemplo, si existe relación entre la superficie cubierta (surface_covered) y el precio total (price) de las propiedades:

ggplot(datos_amba)+
  geom_point(aes(x=surface_covered, y=price))

Tiene sentido, a mayor superficie cubierta, mayor valor. Pero veamos esto desagregado por tipo de operación a ver que pasa:

options(scipen = 20) #Saco notación científica

ggplot(datos_amba)+
  geom_point(aes(x=surface_covered, y=price, color=operation_type))

En el gráfico anterior habrán notado que para darle color usamos el parámetro color en vez de fill. Esto se debe a que en ggplot, cuando queremos colorear “rellenos” (como por ejemplo de histogramas, gráficos de barras, etc) usamos fill y cuando queremos colorear líneas o puntos usamos color. Lo mismo ocurre cuando elegimos una scale: si coloreamos de acuerdo a un atributo elegido como relleno usamos scale_fill_… y si coloreamos de acuerdo a un atributo seleccionado para las líneas o puntos usamos scale_colour_…

No se preocupen si esto no queda del todo claro, ya que haremos varios ejemplos más para que puedan practicarlo! Probemos editar la escala/paleta de colores del gráfico de puntos que realizamos, el tema/theme y agreguemos algunas etiquetas (labs):

ggplot(datos_amba)+
  geom_point(aes(x=surface_covered, y=price, color=operation_type), alpha=0.5) +
  scale_colour_manual(values = c("darkseagreen4", "chocolate"))+
  theme_light()+
  labs(title="Relación entre superficie cubierta y precio de las publicaciones",
       color="Tipo de operación",
       x="Superficie cubierta (M2)",
       y="Precio",
       caption="Fuente: Properati Mayo y Junio 2021")

Se ve claramente que las propiedades en venta tienen mayor valor que las propiedades en alquiler, lo cuál es lógico pero además sabemos que están expresadas en dólares, por lo tanto, si pasamos todos los valores a $ARS, la diferencia sería aún mayor. Para evitar estar trabajando con valores en diferentes monedas, hagamos un nuevo gráfico donde nos quedemonos solo con las ventas y agreguemos en el color una tercer variable numérica: el valor del m2.

ggplot(datos_amba %>%
         filter(operation_type=="Venta"))+
  geom_point(aes(x=surface_covered, y=price, color=price/surface_covered), alpha=0.5) +
  theme_light()+
  labs(title="Relación entre superficie cubierta y precio de las publicaciones",
       color="Valor del m2 (USD)",
       x="Superficie cubierta (M2)",
       y="Precio de la propiedad (USD)",
       caption="Fuente: Properati Mayo y Junio 2021")

Y ahora agreguemos nuestra paleta de color, pero en este caso usemos la opción “magma” de viridis, una de las paletas “pre armadas” y listas para usar:

ggplot(datos_amba %>%
         filter(operation_type=="Venta"))+
  geom_point(aes(x=surface_covered, y=price, color=price/surface_covered), alpha=0.5) +
  scale_color_viridis_c(option="magma") +
  theme_light()+
  labs(title="Relación entre superficie cubierta y precio de las publicaciones",
       color="Valor del m2 (USD)",
       x="Superficie cubierta (M2)",
       y="Precio de la propiedad (USD)",
       caption="Fuente: Properati Mayo y Junio 2021")

Un parámetro “extra” que tiene el gráfico de puntos, a diferencia del histograma, es el “tamaño” o “size”, ya que ggplot nos permite elegir una variable más para visualizar el tamaño de los puntos de acuerdo a sus valores. Probemos agregando una tercer variable (categórica) a nuestro gráfico: la provincia.

ggplot(datos_amba %>%
         filter(operation_type=="Venta"))+
  geom_point(aes(x=surface_covered, y=price, color=price/surface_covered, size=provincia), alpha=0.5) +
  scale_color_viridis_c(option="magma") +
  theme_light()+
  labs(title="Relación entre superficie cubierta y precio de las publicaciones",
       color="Valor del m2 (USD)",
       size="Zona",
       x="Superficie cubierta (M2)",
       y="Precio de la propiedad (USD)",
       caption="Fuente: Properati Mayo y Junio 2021")

Por ejemplo, podemos ver que:

  • En GBA no crece tan rápido la relación como en CABA.

  • Las propiedades con mayor valor del m2 se ubican en CABA y las de menor en GBA.

  • Las propiedades de CABA tienen menor cantidad de m2 cubiertos que las de GBA.

Por último, probemos utilizar en scale_color_distiller() una paleta de brewer (pueden ver los códigos y combinaciones en este link y agreguemos un facetado según fecha de publicación:

ggplot(datos_amba %>%
         filter(operation_type=="Venta"))+
  geom_point(aes(x=surface_covered, y=price, color=price/surface_covered, size=provincia), alpha=0.5) +
  scale_color_distiller(palette="YlGnBu") +
  theme_light()+
  labs(title="Relación entre superficie cubierta y precio de las publicaciones",
       color="Valor del m2 (USD)",
       size="Zona",
       x="Superficie cubierta (M2)",
       y="Precio de la propiedad (USD)",
       caption="Fuente: Properati Mayo y Junio 2021")+
  facet_wrap(~created_on)

Relación entre variable numérica y variable categórica: Gráfico de Barras

El gráfico de barras representa, a partir de la longitud de las barras, el valor numérico (eje Y) asociado a cada entidad de la variable categórica (eje X).

Al igual que en la visualización anterior, es necesario elegir una variable para el eje X y otra para el eje Y (acá se llama weight). Sin embargo, si no asignamos ninguna variable numérica a weight, el gráfico automáticamente va a calcular cuantas veces aparece cada categoría en la base de datos.

Por ejemplo, veamos cuantas observaciones hay por tipo de operación:

ggplot(datos_amba)+
  geom_bar(aes(x=operation_type))

En el gráfico anterior podemos ver que hay alrededor de 12.000 propiedades en venta y 3.000 en alquiler.

Veamos esto desagregado por tipo de propiedad:

ggplot(datos_amba)+
  geom_bar(aes(x=operation_type, fill=property_type))

Podemos ver que predominan los departamentos en ambos casos. Ahora ajustemos cuestiones estéticas del gráfico y agreguemos etiquetas (labs):

ggplot(datos_amba)+
  geom_bar(aes(x=operation_type, fill=property_type))+
  scale_fill_manual(values = c("goldenrod2", "turquoise4", "deeppink3"))+
  labs(title="Oferta publicada por Operación y Tipo de Propiedad",
       fill="Tipo",
       x="Operación",
       y="Cantidad",
       caption="Fuente: Properati Mayo y Junio 2021")

Y facetemos por la variable provincia:

ggplot(datos_amba)+
  geom_bar(aes(x=operation_type, fill=property_type)) +
  scale_fill_manual(values = c("goldenrod2", "turquoise4", "deeppink3"))+
  labs(title="Oferta publicada según Zona por Operación y Tipo de Propiedad",
       fill="Tipo",
       x="Operación",
       y="Cantidad",
       caption="Fuente: Properati Mayo y Junio 2021")+
  facet_grid(~provincia)

En ambos casos siguen predominando los departamentos pero también se puede ver como la cantidad de casas en venta en GBA es muy similar a la de departamentos; mientras que en CABA casi no hay casas publicadas.

Las barras apiladas con valores absolutos es una de las opciones a la hora de graficar y la que nos hace por defecto ggplot2, pero existen 2 más:

  • Las barras apiladas con valores relativos (%)

  • Las barras agrupadas con valores absolutos

Veamos de que se trata cada una!

Barras apiladas con valores relativos (%)

Este tipo de gráfico ayuda a detectar las diferencias relativas que existen entre los valores continuos de cada grupo/categoría. Cada barra del gráfico muestra el total de cada categoría y se representa por el apilado de los porcentajes de cada valor. Con ggplot() usaremos position=position_fill():

ggplot(datos_amba)+
  geom_bar(aes(x=operation_type, fill=property_type), position=position_fill()) +
  scale_fill_manual(values = c("goldenrod2", "turquoise4", "deeppink3"))+
  labs(title="Oferta publicada según Zona por Operación y Tipo de Propiedad",
       fill="Tipo",
       x="Operación",
       y="Porcentaje",
       caption="Fuente: Properati Mayo y Junio 2021")+
  facet_grid(~provincia)

Barras agrupadas con valores absolutos

Este tipo de gráfico se utiliza cuando los datos absolutos se agrupan en 2 o más categorías dentro del mismo eje. Con ggplot() usaremos position=position_dodge():

ggplot(datos_amba)+
  geom_bar(aes(x=operation_type, fill=property_type), position=position_dodge()) +
  scale_fill_manual(values = c("goldenrod2", "turquoise4", "deeppink3"))+
  labs(title="Oferta publicada según Zona por Operación y Tipo de Propiedad",
       fill="Tipo",
       x="Operación",
       y="Cantidad",
       caption="Fuente: Properati Mayo y Junio 2021")+
  facet_grid(~provincia)

Ahora investiguemos otra variable de nuestro dataset, veamos de cuántos ambientes son las propiedades que predominan en cada zona para cada operación inmobiliaria:

ggplot(datos_amba)+
  geom_bar(aes(x=as.factor(rooms), fill=provincia), position=position_dodge()) +
  labs(title="Oferta de Propiedades en Alquiler",
       subtitle="Según cantidad de ambientes",
       fill="Zona",
       x="Cantidad de Ambientes",
       y="Cantidad",
       caption="Fuente: Properati") +
  scale_fill_manual(values = c("goldenrod2", "indianred2")) +
  facet_grid(operation_type~.)

Vemos que:

  • Los monoambientes publicados en CABA triplican los publicados en GBA.
  • Para ambas operaciones, en CABA predominan los 2 y 3 ambientes.
  • En las ventas de GBA predominan los 2, 3 y 4 ambientes.
  • Para ambas zonas, las propiedades con más de 5 ambientes solo se encuentran en venta (no en alquiler).

Ahora entremos más en detalle y analicemos los datos por partido. Para eso filtremos por Ventas e incorporemos un valor weight: precio del m2. Como vimos que hay varios outliers en los datos del valor del m2 que pueden afectar el promedio, utilizaremos la mediana:

ggplot(datos_amba %>%
        group_by(provincia, partido, operation_type) %>%
        summarise(price_m2=median(price/surface_covered)) %>%
        filter(operation_type=="Venta"))+
  geom_bar(aes(x=reorder(partido, price_m2), weight=price_m2, fill=provincia)) +
  labs(title="Valor del m2 de Propiedades en Venta",
       subtitle="CABA + GBA",
       fill="Zona",
       x="Partido",
       y="Valor del m2 (USD)",
       caption="Fuente: Properati") +
  scale_fill_manual(values = c("goldenrod2", "indianred2")) +
  theme_light()+
  coord_flip()

Se ve un poco empastado y es difícil de leer. Probemos filtrando solo aquellos donde el valor del m2 es mayor a 2.000 USD:

ggplot(datos_amba %>%
        group_by(provincia, partido, operation_type) %>%
        summarise(price_m2=median(price/surface_covered)) %>%
        filter(operation_type=="Venta" & price_m2>=2000))+
  geom_bar(aes(x=reorder(partido, price_m2), weight=price_m2, fill=provincia)) +
  labs(title="Valor del m2 de Propiedades en Venta",
       subtitle="CABA + GBA",
       fill="Zona",
       x="Partido",
       y="Valor del m2 (USD)",
       caption="Fuente: Properati") +
  scale_fill_manual(values = c("goldenrod2", "indianred2")) +
  theme_light() +
  coord_flip()

Agreguemos etiquetas con geom_text() que nos faciliten la lectura:

ggplot(datos_amba %>%
        group_by(provincia, partido, operation_type) %>%
        summarise(price_m2=median(price/surface_covered)) %>%
        filter(operation_type=="Venta" & price_m2>=2000))+
  geom_bar(aes(x=reorder(partido, price_m2), weight=price_m2, fill=provincia)) +
  geom_text(aes(x=partido, y=price_m2+100, label=as.integer(price_m2)), size=2.5, color="gray14")+
  labs(title="Valor del m2 de Propiedades en Venta",
       subtitle="CABA + GBA",
       fill="Zona",
       x="Partido",
       y="Valor del m2 (USD)",
       caption="Fuente: Properati") +
  scale_fill_manual(values = c("goldenrod2", "indianred2")) +
  theme_light() +
  coord_flip()

Bonus Track: Ajustes Estéticos

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(), vimos como estos elementos se asignan por defecto y a veces pueden no 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!

Veamos un ejemplo a partir del último gráfico:

ggplot(datos_amba %>%
        group_by(provincia, partido, operation_type) %>%
        summarise(price_m2=median(price/surface_covered)) %>%
        filter(operation_type=="Venta" & price_m2>=2000))+
  geom_bar(aes(x=reorder(partido, price_m2), weight=price_m2, fill=provincia)) +
  geom_text(aes(x=partido, y=price_m2+150, label=as.integer(price_m2)), size=2.5, color="gray14")+
  labs(title="Valor del m2 de Propiedades en Venta",
       subtitle="CABA + GBA",
       fill="Zona",
       x="Partido",
       y="Valor del m2 (USD)",
       caption="Fuente: Properati") +
  scale_fill_manual(values = c("goldenrod2", "indianred2")) +
  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
        plot.title=element_text(size=12, face = "bold"), #tamaño de titulo del mapa
        plot.subtitle=element_text(size=9, face = "bold"), #tamaño de subtitulo del mapa
        legend.key.size = unit(0.4, "cm"), #alto de cuadrados de referencia
        legend.key.width = unit(0.4,"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=8, 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 = "gray35",size = 6, angle = 90), #tamaño y color del texto de eje X
        axis.text.y = element_text(colour = "gray35",size = 6)) #tamaño y color del texto de eje Y