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
library(ggplot2movies)  #Para utilizar el data frame *movies*

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 :: diamonds

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í.

3.0.3 ggplot2movies :: movies

Es un conjunto de datos sobre películas, el cual estaba contenido anteriormente en ggplot2, pero se ha movido su propio paquete para reducir el tamaño de descarga de ggplot2. Es un data frame con 28819 observaciones y 24 variables, las cuales se describen en este enlace (click 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: Estudiantes

Ejemplo 1 (variable Edad)

Para construir un diagrama de barras 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="red", fill="skyblue") +            #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=red,\n fill=skyblue", 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, scale_x_binned)

Para histogramas con pequeñas separaciones entre cada barra, use geom_bar con scale_x_binned.

ggplot(datosCompleto, aes(x = as.numeric(Edad))) +                         #1
  #geom_histogram() +                                                      #2
   geom_bar(bins=50, colour="red", fill="skyblue") +                       #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(0,42)) +                     #4
  ggtitle("Histograma")  +            #5
  
  #theme_bw() +                       #6
   theme_bw(base_size = 12) +         #6
  #coord_flip() +                     #7
  
  geom_text(geom = "text",label="colour=red,\n fill=skyblue", x=25,y=50,col="black") + #8
  scale_x_binned()                    #9

Ejemplo 4 (variable Edad, scale_x_binned, coord_flip)

Con coord_flip se puede cambiar la orientación del histograma.

ggplot(datosCompleto, aes(x = as.numeric(Edad))) +                         #1
  #geom_histogram() +                                                      #2
   geom_bar(bins=10, colour="darkblue", fill="orange") +                       #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(0,42)) +                     #4
  ggtitle("Histograma")  +            #5
  
  #theme_bw() +                       #6
   theme_bw(base_size = 12) +         #6
   coord_flip() +                     #7
  
  geom_text(geom = "text",label="colour=darkblue,\n fill=orange", x=25,y=50,col="black")  + #8
  scale_x_binned()                    #9

6 Ejemplos: diamonds

Ejemplo 5 (diamonds, binwith, bins)

Compare los diferentes histogramas al aplicar las opciones binwith y bins y cuando no se tienen en cuenta.

A <- ggplot(diamonds, aes(carat)) +
     geom_histogram(fill="orange", colour="black")

B <- ggplot(diamonds, aes(carat)) +
     geom_histogram(binwidth = 0.01, fill="green", colour="darkblue")


C <- ggplot(diamonds, aes(carat)) +
     geom_histogram(bins = 10, fill="red", colour="black")

D <- ggplot(diamonds, aes(carat)) +
     geom_histogram(bins = 100, fill="green", colour="brown")

Ejemplo 6 (diamonds, boundary)

Se puede especificar el límite (es decir, la posición del lado izquierdo o derecho) o el centro de una barra con el argumento boundary. En este ejemplo, se está forzando una ruptura de la barra en 0.0 en la gráfica B, mientras que la gráfica A, se asigna la ruptura de la barra automáticamente en función de un ancho de intervalo de 1. Observe los cambios en en esos dos histogramas.

A <- ggplot(diamonds, aes(carat)) +
     geom_histogram(binwidth = 1, fill="orange", colour="darkblue") +                    
     ggtitle("Histograma sin boundary")  

B <- ggplot(diamonds, aes(carat)) +
     geom_histogram(binwidth = 1, boundary = 0, fill="brown", colour="green") +                   
     ggtitle("Histograma con boundary=0")  

7 Ejemplos: movies

Ejemplo 7 (ggplot2movies, movies)

La siguiente gráfica muestra la cantidad de películas en cada calificación (rating).

library(ggplot2movies)

h <- ggplot(movies, aes(rating))
h + geom_histogram(binwidth = 0.1, fill="red", colour="blue") + 
    ylim(c(0,2000)) +
    xlim(c(0,12))

Ejemplo 8 (ggplot2movies, weight)

Si queremos ver el número de votos emitidos en cada categoría, necesitamos ponderar por la variable votes con la opción weight=votes.

h + geom_histogram(aes(weight = votes), binwidth = 0.1, fill="blue", colour="red") +
  ylab("Votos emitidos")

Ejemplo 9 (ggplot2movies, weight)

Para escalas transformadas, binwidth se aplica a los datos transformados. Las barras tienen un ancho constante en la escala transformada.

h + geom_histogram(fill="yellow", colour="brown") +
    ylim(c(0,12000)) +
    scale_x_log10()

h + geom_histogram(binwidth = 0.05, fill="skyblue", colour="black") +
    ylim(c(0,12000)) +
    scale_x_log10()

Ejemplo 10 (boundary=0, log10)

Para los sistemas de coordenadas transformados, la opción binwidth se aplica a todos los datos, originando que las barras tengan siempre un ancho constante en la escala original. Pero también podemos utilizar escalas logarítmicas. En general, esta transformación no funciona porque la primera barra está anclada en cero, por lo que cuando se transforma se vuelve negativo infinito. Por esta razón, utilizamos la opción boundary = 0 para evitar este problema a la hora de transformar la escala, ya que tiene el efecto de que ninguna observación tenga valor 0.

h + geom_histogram(boundary = 0, fill="green", colour="brown") +
  coord_trans(x = "log10")

Ejemplo 11 (boundary=0, log10)

También se usa boundary = 0 para asegurarse de que sqrt no tome valores negativos.

h + geom_histogram(boundary = 0, fill="orange", colour="darkred") +
    coord_trans(x = "sqrt")

Ejemplo 12 (ggplot2movies, scale_y_sqrt)

También se puede transformar el eje y. Debido a que la base de las barras tiene valor 0, las transformaciones logarítmicas no son apropiadas.

h + geom_histogram(binwidth = 0.5, fill="red", colour="blue") +
    scale_y_sqrt()

8 Caso bivariado

A manera de ejemplo, supongamos que se quiere analizar la distribución de las personas según una variable 1 (variable auxiliar de interés, por ejemplo, FUMA), dentro de cada nivel de una variable 2 (grupo de referencia, por ejemplo, COLEGIO), teniendo en cuenta:

  1. Todas las personas.

  2. Solo las que pertenecen a un grupo en particular (por ejemplo, solo las MUJERES o solo los HOMBRES).

Para estos casos, ggplot2 también puede ayudarnos a construir el diagrama de barras respectivo. No lo describiremos en este documento. Para una explicación al respecto, puede consultarse mi documento RPubs :: Histogramas con ggplot2 (por grupos) se pueden encontrar documentos relacionados, con ejemplos aplicados. También, se puede revisar el documento Histograms and frequency polygons.

9 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 13: 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 <- ggplot(datosCompleto, aes(x = as.numeric(Edad))) +
  geom_histogram(colour="red", fill="yellow") +    
  labs(x="Edad",y= "Frecuencia")  +
  ylim(c(0,60))                


H2 <- ggplot(datosCompleto, aes(x = as.numeric(Edad))) +
  geom_histogram(colour="darkblue", fill="red") +    
  labs(x="Edad",y= "")  +
  ylim(c(0,60))

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

Ejemplo 14: 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 <- ggplot(datosCompleto, aes(x = as.numeric(Edad))) +
  geom_histogram(colour="black", fill="green") +    
  labs(x="Edad",y= "Frecuencia")  +
  ylim(c(0,60))     +
  coord_flip()

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

Ejemplo 15: 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 16: Cuatro gráficas

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

H4 <- ggplot(datosCompleto, aes(x = as.numeric(Edad))) +
  geom_histogram(colour="Red", fill="skyblue") +    
  labs(x="",y= "Frecuencia")  +
  ylim(c(0,60))     +
  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)  

10 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 17 (grid.arrange)

library(gridExtra)

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

11 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.