hllinas

1 Introducción

Primero, debemos instalar y descargar las librerías que vamos a utilizar.

library(dplyr)
library(ggplot2)
library(cowplot)  #Para unir gráficos generados por ggplot2

2 Data frame

Recuerde que el data frame (básicamente una tabla) es en realidad solo un tipo específico de otra estructura de datos (la lista). Actualmente, es el formato de entrada de nuestros datos más frecuente para los análisis estadísticos (dentro de R, pero también para otros programas estadísticos y, por supuesto, para softwares de hojas de cálculo). Por esta razón, primero, es importante importar/cargar los datos antes de iniciar nuestro análisis. Esto ya se explicó en el documento Rpubs :: Importar datasets.

En los documentos Rpubs :: Examinar data frames y Rpubs :: Examinar data frames explicamos algunas funciones de R que nos permiten revisar propiedades de los data frames de las variables que contenidads en él. En Rpubs :: Recodificar variables describimos como recodificar las variables. Para más detalles relacionados con los data frames, se puede consultar el documento Rpubs :: data frames (generalidades).

3 Nuestros data frames

3.0.1 Estudiantes

Vamos a utilizar un conjunto de datos, que fueron recogidos aplicando una encuesta a una muestra de estudiantes universitarios. Es un data frame con 400 observaciones y 46 variables, las cuales se describen en este enlace (click aquí). En este documento, se importará la base de datos desde una dirección web (dos opciones):

Opción A (web, desde github): Para esta opción, se necesita cargar la librería “repmis”:

library(repmis)
source_data("https://github.com/hllinas/DatosPublicos/blob/main/Estudiantes.Rdata?raw=false")
datosCompleto <- Estudiantes

Opción B (web, desde Google Drive):

url.dat<- "http://bit.ly/Database-Estudiantes"
datosCompleto <- read.delim(url.dat)

Recuérdense las otras opciones, si tienen las bases de datos descargadas en su sesión de trabajo (ya sea en extensiones en Rdata, en excel o en otros formatos). Para más detalles, véase el documento RPubs :: Importar datasets básico. A manera de ejemplo:

Opción C (local, con archivo en Rdata):

load(file="Estudiantes.Rdata")
datosCompleto <- Estudiantes

Opción D (local, con archivo en excel):

datosCompleto <- read.delim('clipboard')

3.0.2 ggplot2 :: economics_long

Es un conjunto de datos sobre precios y otros atributos de más de 50.000 diamantes. Es un data frame con 53940 observaciones y 10 variables, las cuales se describen aquí.

4 La librería ggplot2

Con ggplot2 se pueden construir gráficos y su gramática está basado en un proceso de acumulación de capas o layers. Tiene un cierto nivel de complejidad, pero se obtienen resultados muy profesionales. Para una mejor aplicación de las funciones de este paquete, sugiero apoyarse en la hoja de referencia Data Visualization with ggplot2 :: Cheat Sheet o en la página de referencias ggplot2 :: Reference o en mi documento RPubs :: Histogramas y polígonos de frecuencias con ggplot2 (general).

En este documento, presentaremos ejemplos sobre la manera de construir histogramas con ggplot2. También, se puede revisar el documento Histograms and frequency polygons.

5 Ejemplos

Ejemplo 1 (variable Edad)

Recordemos que para construir un diagrama de barras (univariado) para la variable Edad, procedemos así (en el ejemplo 2, se describe cada capa):

ggplot(datosCompleto, aes(x = as.numeric(Edad))) +                         #1
  #geom_histogram() +                                                      #2
   geom_histogram(binwidth=0.6, colour="black", fill="yellow") +            #2 
  #geom_histogram(bins=50, fill="yellow", colour="darkblue", alpha=1.5) +  #2
  
  labs(x="Edad",y= "Frecuencia")  +   #3               
  ylim(c(0,60)) +                     #4
  xlim(c(10,32)) +                    #4
  ggtitle("Histograma")  +            #5
  
  #theme_bw() +                       #6
   theme_bw(base_size = 12) +         #6
  #coord_flip() +                     #7
  
  geom_text(geom = "text",label="colour=skyblue,\n fill=yellow", x=25,y=50,col="black")  #8

Ejemplo 2: Descripción de las capas en el ejemplo 1 (que se agregan con el signo “+”)

Consideremos el código presentado en el ejemplo 1.

  1. En esta capa, se especifica el data frame y, con aes(x=…, y=…, fill=…), las variables que se van a utilizar.

  2. Se crea el histograma con geom_histogram(). Si no se escriben argumentos dentro de los paréntesis, sale en escala de grises y negro. Para cambiar el ancho de las barras, así como los colores de su borde e interior, el número de barras y la intensidad del color se utilizan las opciones binwidth, colour, fill, bins y alpha, respectivamente, como argumentos de geom_histogram.

  3. Con labs(), se asignan los nombres de los ejes X y Y (y el de las leyendas, si las hay). Con y="" (sin nada adentro de las comillas), el nombre en el eje Y no aparecerá.

  4. Para ajustar la escala de los ejes X y Y, se utilizan xlim() y ylim(), respectivamente.

  5. Se utiliza ggtitle para agregar un título del diagrama.

  6. Para cambiar el fondo del diagrama, se agrega la capa theme_bw(). En este caso, el fondo del diagrama será a blanco y negro. Para cambiar el tamaño de las fuentes del diagrama (por ejemplo, a 12 puntos), se escribe la opción base_size=12 en theme_bw().

  7. Para rotar horizontalmente el diagrama, se agrega la capa coord_flip().

  8. Con geom_text se agregan textos a la gráfica, indicando el texto con labels (observe que se ha utilizado para bajar de línea); la posición del texto con x=.., y=…; y el color del texto con col =“…”*.

Ejemplo 3 (variable Edad, por Sexo)

Ahora, supongamos que queremos construir el histograma (univariado) para la variable Edad para todas las edades (gráfica A) y compararlo con los histogramas correspondientes a cada nivel de Sexo (gráficas B y C):

A <- datosCompleto %>% ggplot(aes(as.numeric(Edad))) + 
  geom_histogram(data = subset(datosCompleto,Sexo=="Femenino"),fill="red", colour= "black")+
  labs(x="Edades",y="Counts") +
  ylim(c(0,51))


B <- datosCompleto %>% ggplot(aes(as.numeric(Edad))) + 
  geom_histogram(data = subset(datosCompleto,Sexo=="Masculino"),fill="blue", colour= "black") +
  labs(x="Edades",y="Counts") +
  ylim(c(0,51))

C <- datosCompleto %>% ggplot(aes(as.numeric(Edad))) + 
  geom_histogram(binwidth=0.6, colour="black", fill="yellow") +
  labs(x="Edades",y="Counts") +
  ylim(c(0,51))

Ejemplo 5 (superponer o apilar histogramas)

Otra variación del histograma es mostrar superposición. Esto es posible de 2 formas:

  1. La primera es superponer un subconjunto de datos (que corresponde a los datos filtrados por un nivel de una variable categórica) en el conjunto que contiene todos los datos. Véase el ejemplo 5.

  2. La segunda posibilidad para superponer histogramas es cuando el conjunto de datos está segmentado. Véase el ejemplo 6.

Ejemplo 6 (Edad dentro de la variable Sexo: primera forma)

Este ejemplo corresponde al primer caso, mencionado en el ejemplo 5. Supongamos que queremos comparar valores de las edades por por Sexo (Masculino y Femenino) con la distribución total de edades. Esto se logra agregando tres (3) capas al histograma después de crear los subconjuntos de datos correspondientes con la función subset.

datosCompleto %>% ggplot(aes(as.numeric(Edad))) + 
  geom_histogram(binwidth=0.6, colour="black", fill="yellow") +
  geom_histogram(data = subset(datosCompleto,Sexo=="Femenino"),fill="red", colour= "black", alpha=.5)+
  geom_histogram(data = subset(datosCompleto,Sexo=="Masculino"),fill="blue", colour= "black", alpha=.5) +
   labs(x="Edades",y="Counts")

Ejemplo 7 (Edad dentro de la variable Sexo: segunda forma)

Este ejemplo corresponde al segundo caso, mencionado en el ejemplo 5. Al agregar el argumento position = “identity” en el geom_histogram (véase el código de abajo), los histogramas apilados se convierten en histogramas superpuestos como se observa en la imagen de abajo. Al comparar los dos gráficos, se puede ver el cambio en el número de recuentos en las regiones superpuestas, ya que los datos apilados anteriormente tenían un recuento más alto debido a la agregación (gráfico A). Pero este no es el caso en el segundo gráfico (B), ya que los datos ahora se superponen entre sí.

aa1 <- datosCompleto %>% ggplot(aes(as.numeric(Edad), fill=Sexo)) + 
  geom_histogram(binwidth=0.6, colour="black") +
  labs(x="Edades",y="Counts") +                       
  ggtitle("Histogramas apilados") +
  ylim(c(0,51))
  

aa2 <- datosCompleto %>% ggplot(aes(as.numeric(Edad), fill=Sexo)) + 
  geom_histogram(binwidth=0.6, colour="black", position="identity") +
  labs(x="Edades",y="Counts") +                       
  ggtitle("Histogramas superpuestos") +
  ylim(c(0,51))

plot_grid(aa1, aa2, nrow  = 2, ncol=1, labels="AUTO") 

Ejemplo 8 (Edad, facet_wrap)

Podemos especificar una función para calcular binwidth cuando se desea facetar variables con rangos diferentes. Esta función se llamará una vez por faceta. Utilizaremos la opción scales, que corresponden a escalas compartidas en todas las facetas (la predeterminada es fixed), o varían entre filas (free_x), columnas (free_y) o tanto filas como columnas (free).

ggplot(datosCompleto, aes(as.numeric(Edad))) +
   geom_histogram(binwidth = function(x) 20 / (sqrt(length(x))), colour="black", fill="orange") +
   facet_wrap(~Sexo, scales = 'free_x') 

Ejemplo 9 (economics_long, facet_wrap)

En este ejemplo, utilizaremos el data frame economics_long, el cual contiene 4 variables (date, variable, value y value01). Vamos a presentar otro ejemplo calculando binwidth con otra función.

ggplot(economics_long, aes(value)) +
   geom_histogram(binwidth = function(x) 2 * IQR(x) / (length(x)^(1/3)), colour="darkblue", fill="green") +
   facet_wrap(~variable, scales = 'free_x') 

6 Combinar con plot_grid

plot_grid es una función de la librería cowplot. Permite arreglar varias gráficas en una cuadrícula.

  1. El número de filas y columnas en la cuadrícula de la gráfica se puede especificar a través de nrow y ncol.

  2. Con labels=c(…) se especifican las etiquetas para cada gráfica.

  3. Si se especifican las etiquetas con labels=“AUTO” o labels=“auto”, las etiquetas se generarán automáticamente en mayúsculas o minúsculas, respectivamente.

  4. El tamaño de las etiquetas se puede ajustar a través de la opción label_size. El valor predeterminado es 14, por lo que los valores más grandes harán que las etiquetas sean más grandes y los valores más pequeños las harán más pequeñas.

  5. Algunas veces, los gráficos no están alineados. En muchos casos se pueden alinear mediante la opción align.

  6. Otras opciones de plot_grid son, entre otras, las siguientes:

    • Ajustar la familia de fuentes, la fuente y el color de las etiquetas (con label_fontfamily, label_fontface y label_colour, respectivamente).

    • Mover las etiquetas (con label_x and label_y).

    • Justificar las etiquetas (con hjust y vjust, respectivamente).

    • Usar el argumento NULL para indicar un gráfico faltante en la cuadrícula. Debe tenerse en cuenta que los gráficos faltantes se etiquetarán si se activa el etiquetado automático.

    • Ajustar los anchos y las alturas de filas y columnas (rel_widths y rel_heights, respectivamente).

    • Crear cuadrículas de gráficas anidadas.

  7. La presentación de la unión de las gráficas depende del arreglo rectangular de las gráficas que queramos unir. Para más detalles y ejemplos, puede consultarse el documento Arranging plots in a grid.

Ejemplo 14: Dos gráficas en una fila (sin especificar etiquetas y alineando)

La idea es combinar dos gráficas en una sola fila (sin especificar etiquetas y alineando). En este ejemplo, aparece la opción align con el fin de alinear las gráficas. Si el lector lo considera, lo puede quitar.

H1 <- datosCompleto %>% ggplot(aes(as.numeric(Edad), fill=Sexo)) + 
  geom_histogram(binwidth=0.6, colour="black") +
  labs(x="Edades",y="Counts") +                       
  ggtitle("Histogramas apilados") +
  ylim(c(0,51))
  

H2 <- datosCompleto %>% ggplot(aes(as.numeric(Edad), fill=Sexo)) + 
  geom_histogram(binwidth=0.6, colour="black", position="identity") +
  labs(x="Edades",y="Counts") +                       
  ggtitle("Histogramas superpuestos") +
  ylim(c(0,51))

plot_grid(H1, H2, nrow= 1, align = "h")   

Ejemplo 15: Tres gráficas en una cuadrícula de 2x2 (con labels=“AUTO”)

Vamos a combinar tres gráficas en una cuadrícula de 2 filas y 2 columnas (especificando etiquetas automáticas con la opción labels=“AUTO”). En la gráfica de abajo, observe la ubicación del tercer gráfico (a la izquierda).

H3 <- datosCompleto %>% ggplot(aes(as.numeric(Edad))) + 
  geom_histogram(binwidth=0.6, colour="black", fill="yellow") +
  labs(x="Edades",y="Counts") +                       
  ggtitle("Todas la edades") +
  ylim(c(0,51))    +
  coord_flip()

plot_grid(H1, H2, H3, nrow  = 2, ncol=2, labels="AUTO")  

Ejemplo 16: Tres gráficas en una cuadrícula de (1x2)x1

En el ejemplo anterior, el tercer gráfico se puede centrar como se muestra abajo.

g1 <- plot_grid(H1, H2, nrow  = 1, ncol=2, labels="AUTO", align="h", label_size=10)  

plot_grid(g1, H3, nrow  = 2, ncol=1, labels = c('','F'))

Ejemplo 17: Cuatro gráficas

Ahora, vamos a combinar cuatro gráficas en una cuadrícula de 2 filas y 2 columnas (especificando nuestras etiquetas).

H4 <- datosCompleto %>% ggplot(aes(as.numeric(Edad))) + 
  geom_histogram(binwidth=0.6, colour="black", fill="yellow") +
  geom_histogram(data = subset(datosCompleto,Sexo=="Femenino"),fill="red", colour= "black", alpha=.5)+
  geom_histogram(data = subset(datosCompleto,Sexo=="Masculino"),fill="blue", colour= "black", alpha=.5) +
   labs(x="Edades",y="Counts") +                      
  ggtitle("Edades completas y por género")     +
  coord_flip()

g2<-plot_grid(H1, H2, nrow = 1, ncol=2, labels = c('A','B'))     
g3 <- plot_grid(H3, H4, nrow  = 1, ncol=2, labels = c('D','E'))

plot_grid(g2, g3, nrow  = 2, ncol=1)  

7 Otras formas de combinar gráficas

Hay otras maneras que nos permiten unir gráficas en ggplot2. En los siguientes documentos, podemos encontrar una variedad de paquetes y funciones para este propósito.

  1. ggplot2 - Easy way to mix multiple graphs on the same page: click aquí.

  2. Arranging multiple grobs on a page: click aquí.

Ejemplo 18 (grid.arrange)

library(gridExtra)

grid.arrange(H1, H2, nrow = 1)

8 Ejercicios

Crear un nuevo documento R Markdown, realizando las siguientes actividades con ayuda de ggplot2:

  1. Crear un cuatro (4) histogramas con otras variables numéricas, “jugando” con sus propiedades.

  2. Unir los gráficos con la función plot_grid, “jugando” con las opciones de la función.

  3. Unir gráficos con otras funciones.

En todos los casos, interpete los resultados y diagramas resultantes.

Bibliografía

  1. LLinás, H., Rojas, C. (2005); Estadística descriptiva y distribuciones de probabilidad. Barranquilla: Editorial Universidad del Norte.

  2. Consultar el documento RPubs :: Enlace y materiales de ayuda.

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.