1. Introducción a ggplot2

Cargamos las librerías que usaremos:

library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
#Cargar datos:
data("diamonds")

1.1. Gráfico de dispersión: 2 variables numéricas.

Como es bien sabido, un gráfico de dispersión es una forma de representar en un plano cartesiano la relación entre dos variables continuas1. De esta forma podemos representar visualmente el grado de asociación entre ambas.

#Peso y precio:

ggplot(diamonds, aes(x= carat, y= price))+
geom_point()

1.2 Gráfico de una variable numérica y un factor:

Incluir otra variable para filtrar, especialmente una variable factor o de carácter nominal u ordinal es posible en ggplot mediante usar la opción color= X dentro de la función aes() en donde X es la variable factor que utilizaremos para desagregar.

ggplot(data = diamonds, aes(x=carat, y=price, color=color))+
  geom_point()

1.3 Grafico de puntos: 3 variables numéricas y un factor:

ggplot(diamonds, aes(x=carat, y=price, color=color, size=table))+
  geom_point()

1.4 Agregando otra variable factor:

ggplot(diamonds, aes(x= carat, y=price, color= color, size= table))+
  geom_point()+ facet_wrap(~cut)

1.5 Hacer leyendas y títulos en los gráficos

ggplot(diamonds, aes(x= carat, y=price, color= color, size= table))+
  geom_point()+ facet_wrap(~cut)+labs(title = "Precio de los diamantes por carat", ytitle = "Precio", xtitle = "calidad")

2.0 Gráficos en ggplot2: Histogramas

Los histogramas son una representación gráfica de una variable en forma de barras, normalmente se usan para visualizar la distribución de una variable (por lo generalmente cuantitativa continua). Esta es mostrada en intervalos

La forma más básica de ello es mediante la siguiente estructura de código:

Gráfico <-ggplot(datos, aes(X,Y))+ geom_histogram()

Ahora mismo hacemos un gráfico histograma del precio de la base de datos diamonds: La distribución de los precios de los diamantes tiene un comportamiento asimétrico hacia la derecha.

ggplot(diamonds, aes(price))+
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

p500<- ggplot(diamonds, aes(price))+
  geom_histogram(binwidth = 500, fill = "white", color= "black")+
  labs(title = "Binwidth = 500")
p1000<-ggplot(diamonds, aes(price))+
  geom_histogram(binwidth = 1000, fill= "white", color= "black")+
  labs(title = "Binwidth= 1000")
p1500 <- ggplot(diamonds, aes(price))+
  geom_histogram(binwidth =  1500, fill= "white", color = "black")+
  labs(title = "Binwidth= 1500")
#install.packages("gridExtra") para unir los tres gráficos:
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
grid.arrange(p500, p1000, p1500, ncol= 3)

2.1 Gráficos de histograma por grupos:

Ahora usaremos una variable cut que indica la calidad del corte del diamante. Algo importante para lograr comparaciones por grupos usando histogramas es usando en la capa geom_histogram, dentro del paréntesis, el comando position= “identity”, alpha= 0.5. Para colocar las comparaciones se usa ggplot(data, aes(Y, fill= X)), siendo X la variable de agrupación.

ggplot(diamonds, aes(price, fill=cut))+
  geom_histogram(position = "identity", alpha= 0.5)+
  labs(x="Price", y= "Count")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Otra forma de utilizar la posición de una manera tal que el gráfico sea más entendible (en comparación con el gráfico anterior) es cambiar los comandos respecto a la posición y el bindwidth:

ggplot(diamonds, aes(price, fill=cut))+
  geom_histogram(binwidth = 1500, position = "dodge")

3.0 Gráficos de barras

Los gráficos de barras se utilizan para mostrar comparaciones entre distintas categorías de una variable. Por lo general, en el eje X se muestran diferentes categorías que comparamos y el eje Y es el valor medido. Mientras más alta es la barra, mayor es el valor medido. Partiendo de la siguiente función en la que x representa una variable aleatoria y k un conjunto de atributos relacionados a dicha variable aleatoria (categorías), podemos describir matemáticamente una tabla de frecuencias con la siguiente fórmula:

\[f(x,k)= \sum^{n,k}_{i=1,k}x_{i,k}\]

Es básicamente la sumatoria de los casos que pertenecen a la variable x en la categoría k. Y podemos representarlo gráficamente en Rstudio mediante el siguiente comando: ggplot(data, aes(X,Y))+ geom_bar() . Como ejemplo podemos hacer uso de la variable colors que se encuentra en la base de datos diamond para hacer un gráfico de barras:

#Gráfico de barras:
ggplot(diamonds, aes(color))+geom_bar()+ labs(title= "Gráfico de barras, color:")

El gráfico anterior nos da el conteo o la frecuencia absoluta de cada categoría, en Rstudio podemos cambiar el sentido (poner las barras en vertical y no en horizontal)al gráfico como veremos a continuación:

ggplot(diamonds, aes(color))+
  geom_bar()+
  coord_flip()

3.1 Otros comandos para personalizar las barras:

Otro elemento, al igual que las otras gráficas vistas anteriormente, es que podemos personalizarlas. Como veremos con este ejemplo:

ggplot(diamonds, aes(color))+
  geom_bar(fill="blue", color= "black")+
  theme_minimal()+
  labs(title= "Gráfico de barras~ Color del diamante", subtitle = "Datos del conjunto de datos diamonds de la librería ggplot2")

3.2 Gráfico de barras: tamaño y giro de las leyendas.

Otro aspecto importante que es posible hacer en Rstudio es girar y cambiar el ángulo y posición de las leyendas en el gráfico. Podemos hacerlo con el siguiente código:

ggplot(diamonds, aes(color))+
  geom_bar(fill= "red", color="blue")+
  theme_minimal()+
  labs(title = "Gráfico de barras ~ Color del diamante", subtitle = "Datos del conjunto de diamonds de la librería ggplot2")+ 
  theme(plot.title = element_text(size=20),
        axis.title = element_text(size=16),
        axis.title.y = element_text(angle = 0),
        axis.title.x = element_text(hjust = 1)) #1:Derecha; 0:izquierda; 0.5: centralizado.

3.2.1 Incluir más de una variable en el gráfico:

Es posible estimar el conteo condicional de una variable en relación a otra (podríamos expresarlo con la siguiente fórmula):

\[ P(A|B)= \frac{P(A \cap B)}{P(B)} \]

library(ggplot2)
library(dplyr)

#Primero, estimar la proporción de diamantes:
diamonds_p <- diamonds %>%
  count(color, cut) %>%
  group_by(color) %>%
mutate(prop= n/sum(n)*100)
#Ahora el gráfico debe de hacerse así:
ggplot(diamonds_p, aes(color, prop, fill=cut))+
  geom_bar(stat = "identity")+
  theme_minimal()+
  labs(title= "Gráfico de color por tipo de corte del diamante", subtitle ="Datos extraidos de la base de datos diamonds del paquete ggplot2")

Ahora bien, si queremos la versión del gráfico sin proporción debemos poner lo siguiente:

ggplot(diamonds, aes(color, fill=cut))+
  geom_bar()+
  theme_minimal()+
  labs(title= "Gráfico de color por tipo de corte del diamante", subtitle ="Datos extraidos de la base de datos diamonds del paquete ggplot2")

Si buscamos incluir un gráfico de barras agrupado de otra manera podemos hacerlo así:

ggplot(diamonds, aes(color, fill= cut))+
  geom_bar(position = position_dodge(preserve = "single"))+
  theme_minimal()

4.0 Gráfico de líneas

Este tipo de gráficos representa datos compuestos por puntos conectados por segmentos lineales. Son comúnmente usados en contextos de series temporales y datos de panel. La estructura lógica de la sintaxis usando ggplot2 es:

gráfico_lineas<- ggplot(datos, aes(X,Y))+

geom_line

4.1 Gráfico de líneas básico

En este apartado usaremos la base de datos “sacramento”. Antes que nada, buscar información sobre la base de datos:

#Hay que instalar el paquete caret:
library(caret)
data("Sacramento")

4.1.1 Un ejemplo de un gráfico de líneas

Luego de hacer uso de la base de datos Sacramento, la cual tiene datos de series de tiempo, más idónea para este tipo de gráfico, procedemos a realizar un análisis de tendencia de los preciso de los condominios en Sacramento:

Sacramento_condo <- Sacramento %>%
  filter(type=="Condo")
#Gráfico básico de líneas:
ggplot(Sacramento_condo, aes(x= sqft, y= price))+geom_line()+geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

4.1.2 Gráfico de líneas con color

Es posible cambiar los colores, como vimos anteriormente en los otros tipos de gráficos, al usar el subcomando color

ggplot(Sacramento_condo, aes(x= sqft, y=price, color= "red"))+geom_line()+geom_smooth(method = "lm", color= "brown")
## `geom_smooth()` using formula = 'y ~ x'

4.1.3 Agregar variables categóricas:

ggplot(Sacramento_condo, aes(x=sqft, y=price, color=factor(beds)))+geom_line()

Como vimos anteriormente, pudimos crear un gráfico de líneas que nos dicen que las casas de una sola habitación tienen menos metros cuadrados que aquellas que las de tres. Si queremos modificar el gráfico, por ejemplo, cambiar el grosor de las líneas, se utiliza el comando geomline(size= x)2 siendo x el tamaño deseado3.

ggplot(Sacramento_condo, aes(x=sqft, y=price, color=factor(beds)))+geom_line(linewidth= 1.5)

5.0 Gráficos de caja

Los diagramas de caja es una representación de datos estadísticos, podemos representar gráficamente el mínimo, el primer cuartil, la mediana, el tercer cuartil y el máximo de los datos. El gráfico en Rstudio podemos representarlo de la siguiente manera: gráfico<- ggplot2(datos, aes(X,Y))+ geom_boxplot() . Algunas de las características de la caja son:

5.1 Gráfico de cajas básico

Usando la función ggplot construimos un diagrama de cajas básico usando la siguiente función:

ggplot(diamonds, aes(x= cut, y= price, color= "red"))+
  geom_boxplot()

5.2 Girar el gráfico

Usando el comando o la capa coord_flip() puedes pasar de vertical a horizontal:

ggplot(diamonds, aes(x=cut, y=price))+
  geom_boxplot()+
  coord_flip()

5.3 Colocar una tercera variable:

ggplot(diamonds, aes(x= cut, y= price, fill=color))+
  geom_boxplot()

6.0 Antes de hacer el gráfico…

Los gráficos son un arma muy poderosa en términos de su capacidad de hacer resúmenes de datos, así como describir o explicar propiedades de estos ante un problema dado. Por eso hay una serie de tips importantes que debes de tomar en cuenta siempre antes de hacer un gráfico. Los que podríamos considerar son:

  1. El destinatario (a quién va dirigido el gráfico): No es lo mismo un boletín de una dirección acerca de asuntos coyunturales sobre pobreza y desigualdad que un reporte de investigación. El primero va dirigido a un público menos especializado que el primero.

  2. La pregrunta que debemos responder: La pregunta nos ayuda a pensar en qué gráfico es más adecuado para la cuestión. Para series de tiempo podemos usar un gráfico de líneas o podemos usar un boxplot para poder ver desde su justa dimensión la heterogeneidad de los datos entre individuos en contextos de datos de panel o de diseños longitudinales con corte transversal.

  3. El tipo de gráfico a realizar: el tipo de gráfico depende de muchos elementos. El grupo a analizar, el tipo de dato (si es escalar, cualitativo ordinal o nominal, etc.). Siempre tomar encuenta esto para evitar crear un gráfico saturado que no sea comprendido por quienes lo vayan a leer, especialmente lectores que no son expertos en estadística o en métodos cuantitativos.

  4. La claridad del mensaje: Es bueno procuprar que las leyendas de los títulos del gráfico sean lo suficientemente claras, además del contenido efectivo del gráfico. Me refiero es a los símbolos, los colores, números y escala del mismo, así como la manera de representar categorías en caso de existir variables cualitativas por las cuales desagregar el dato en el la misma.

  5. Estilo propio: No es un pecado tratar de personalizar tus gráficos.

Pero recuerda que el obejtivo final es siempre que el gráfico informe lo que debe de informar, así como poder tomar decisiones a través de este (dependiendo del contexto.

6.1 Etiquetas y leyendas a los gráficos

Las leyendas en los mismos nos permiten identificar las distintas variables o categorías que ilustramos por medio de los gráficos. El paquete ggplot2 permite colocar leyendas de manera fácil, aunque ya de por si viene con unas de gráfica (con los nombres de las variables). Para modificar títulos de las mismas y leyendas se utiliza la capa labs(). Ejemplo:

+ labs(title= "Título del gráfico, subtitle= "Subtítulo del gráfico,y= "Nombre de la variable Y",x= "Nombre de la variable X",color= "Nombre de la variable Color a usar",size= "Nombre de la variable SIZE",caption= "Título interior del gráfico")

6.1.1 Un ejemplo de leyendas y etiquetas

Al principio hicimos un gráfico de dispersión y desagregamos este por el color del diamante en la sección 1. Ahora veamos como se observa con todas las etiquetas y leyendas.

ggplot(data = diamonds, aes(x=carat, y=price, color=color))+
  geom_point()+
  labs(title= "Distribución del precio del diamante",
       subtitle = "Características más importantes que influyen en el precio",
       y= "Precio del diamante", 
       x= "Peso del diamante",
       color= "Color del diamante", 
       caption= "Elaborado por @mella10g")

6.2 El fondo y los marcos (themes)

Estos elementos permiten personalizar el fondo del gráfico, esto permite dar una estética del gráfico según tu conveniencia. El “canvas” se puede modificar con la capa theme() . Adicionalmente existe un paquete llamado ggthemes que permite añadir otra serie de fondos adicionales cuando usas la función ggplot.

Siguiendo el ejemplo anterior de la librería diamonds vamos a cambiar el fondo del gráfico de dispersión:

ggplot(data = diamonds, aes(x=carat, y=price, color=color))+
  geom_point()+
  labs(title= "Distribución del precio del diamante",
       subtitle = "Características más importantes que influyen en el precio",
       y= "Precio del diamante", 
       x= "Peso del diamante",
       color= "Color del diamante", 
       caption= "Elaborado por @mella10g")+
      theme_dark()

En este otro ejemplo usaremos otro tema de gráficos, theme_light():

ggplot(diamonds, aes(x=carat, y=price, color=color))+
  geom_point()+
  labs(title= "Relación entre precio y peso del diamante",
       subtitle = "Características que inciden en el precio",
       y= "Precio del diamante, en US",
       x= "Peso del diamante, en gramos",
       color= "Color del diamante (D= mejor, J= Peor)",
       caption= "Elaborado por @mella10g")+
      theme_light()

6.3 Guardar gráficos (ggsave)

Una forma de guardar gráficos, después de realizados para fines de informe, podemos usar la función ggsave(). Argumentos:

  • filename: Directorio, nombre y formato. Este admite los siguientes: png, eps, ps, text, pdf, jpeg, tiff, bmp, svg o wmf.

  • plot: Gráfico que vamos a guardar.

  • dpi: Resolución del gráfico. Este puede ser “retina (320),”print” (300) o “screen” (72.

  • Width y height: Ancho y altura del gráfico.

El gráfico se graba con la siguiente función:

ggsave(filename = "Gráfico.png", plot= graf, dpi= 300)5

6.3.1 Guardar un gráfico

A continuación tenemos un gráfico que hemos guardado en el objeto dispersion_ejemplo para fines didácticos:

dispersion_ejemplo<- ggplot(diamonds, aes(x= carat, y= price, color=color))+
    geom_point()+
labs(title= "Relación entre precio y peso del diamante",
       subtitle = "Características que inciden en el precio",
       y= "Precio del diamante, en US",
       x= "Peso del diamante, en gramos",
       color= "Color del diamante (D= mejor, J= Peor)",
       caption= "Elaborado por @mella10g")+
      theme_light()+
  geom_hline(yintercept = 10000, color="red", linetype= "dotted", linewidth= 1)+
  geom_vline(xintercept= 3, color= "red", linetype= "dotted", linewidth = 1)+ 
  annotate("text", x=4, y=10700, label= "Diamantes más caros")+
  annotate("text", x=2, y=0, label= "Diamantes más baratos")

dispersion_ejemplo

Ahora para grabar:

ggsave("dispersion_ejemplo.png", plot=dispersion_ejemplo, dpi=320)
## Saving 7 x 5 in image

6.4 Algunas otras fuentes a consultar para mejorar títulos.

Dentro de las que podemos mencionar está STHDA, así como la fuente de los títulos. Otras fuentes para abundar en grabar gráficos ya esa usando ggsave o mediante tidyverse, o usando otras formas hacer click aquí.

Mcgill, Robert, John W. Tukey, y Wayne A. Larsen. 1978. «Variations of Box Plots». The American Statistician 32 (1): 12-16. https://doi.org/10.1080/00031305.1978.10479236.

  1. Es posible más de una variable como detallaremos más adelante.↩︎

  2. Siempre y cuando tu versión de ggplot2 sea previa a la 3.4.0, posterior a esta se utiliza el comando geom_line(linewidth= x)↩︎

  3. Para más info para lograr mayor nivel de personalización de gráficos de líneas puedes consultar aquí.↩︎

  4. Para una variable continua es posible usar en Rstudio otros tipo de capas como geom_quantile() , geom_violin() o geom_jitter() , especialmente para datos pequeños.↩︎

  5. Si no especificamos el nombre del gráfico, ggsave nos guardará el último gráfico que hemos realizado.↩︎