10/07/21
Abstract
La teoría mencionada puede revisarse en el capítulo 1 de mis notas de clase que aparecen en el siguiente documento: 1.1. Estadística básica. En Rpubs:: toc se pueden ver otros documentos de posible interés.
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(forcats) #Para reordenar factores
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).
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')
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 :: Diagrama de barras con ggplot2 (general).
En este documento, presentaremos ejemplos sobre la manera de construir diagrama de barras con ggplot2. Se puede revisar el documento Bar charts para ver otros más.
Es importante resaltar que si no se escribe el nombre del data frame, en la línea de ggplot(.), el punto es obligatorio escribirlo ya que representa al data frame (véase la segunda opción, B, en el código de abajo). El símbolo %>% nos permite:
Concatenar múltiples operaciones con la librería dplyr.
Escribir una secuencia de operaciones de izquierda a derecha. Por eso, en este caso, se debe instalar y ejecutar la librería dplyr.
En el código de abajo se ilustra lo explicado anteriormente.
ggplot("nuestro_data_frame") #A) Primera opción de ecritura
"nuestro_data_frame" %>% ggplot(.) #B) Segunda opción de ecritura
Ejemplo 1 (variable Sexo)
Para construir un diagrama de barras para la variable Sexo, procedemos así (en el ejemplo 2, se describe cada capa):
ggplot(datosCompleto, aes(x = Sexo)) + #1
#geom_bar() + #2
geom_bar(width=0.5, colour="red", fill="skyblue") + #2
labs(x="Sexo",y= "Frecuencia") + #3
ylim(c(0,300)) + #4
#xlim(c(0,300)) + #4
ggtitle("Diagrama de barras") + #5
# theme_bw() + #6
theme_bw(base_size = 12) + #6
#coord_flip() + #7
geom_text(aes(label=..count..), stat='count', #8
position=position_dodge(0.9),
vjust=-0.5,
size=5.0
) +
facet_wrap(~"Variable Sexo") #9
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.
En esta capa, se especifica el data frame y, con aes(x=…, y=…, fill=…), las variables que se van a utilizar.
Se crea el diagrama de barras con geom_bar(). 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 se utilizan las opciones width, colour y fill como argumentos de geom_bar.
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á.
Para ajustar la escala del eje Y, se utiliza ylim(). De manera análoga, se escribe xlim() cuando X sea continua.
Se utiliza ggtitle para agregar un título del diagrama.
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().
Para rotar horizontalmente el diagrama, se agrega la capa coord_flip().
Para agregar sobre las barras las etiquetas de las frecuencias, se agrega la capa geom_text(). Las frecuencias de cada barra se etiquetan mediante el uso de aes(label=..count..) para stat=“count”. Con position=position_dodge y vjust se ajustan las posiciones horizontal y vertical de estas etiquetas. La opción size es el tamaño de la fuente de estas etiquetas.
Para ajustar las facetas de forma rectangular se agrega la capa facet_wrap. La opción ggtitle() se puede quitar si así lo desea. En este caso, si reemplaza facet_wrap por facet_grid, obtenemos el mismo diagrama.
Ejemplo 3 (Otra forma de construir el mismo diagrama)
Observe el código de abajo (las opciones numeradas se explican en el ejemplo 4).
Tabla <- datosCompleto %>% group_by(Sexo) %>% summarise(Total=n()) #10
ggplot(Tabla, aes(x = Sexo, y=Total,fill=Sexo) ) + #11
geom_bar(width = 0.9, stat="identity", #12
position = position_dodge() #13
)+
ylim(c(0,300))+
labs(x="Género de los estudiantes", y= "Frecuencia") +
labs(fill = "")+ #14
geom_text(aes(label=Total), vjust=1.6, color="black", #15
position = position_dodge(0.9), size=4.0
) +
theme_bw(base_size = 15)
Ejemplo 4: Descripción de las capas en el ejemplo 3
Consideremos el código presentado en el ejemplo 3.
Para construir, primero, la tabla de frecuencias.
Observe que, ahora, se introducen: una nueva variable Y en la aesthetic (el total) y la opción fill, para colorear las barras de acuerdo al Sexo.
Las alturas de las barras representan comúnmente una de dos cosas: un recuento de casos en cada grupo o los valores en una columna del marco de datos. Por defecto, geom_bar usa stat = “bin”. Esto hace que la altura de cada barra sea igual al número de casos de cada grupo. Si desea que las alturas de las barras representen valores en los datos, usamos stat = “identity”. En este sentido, estamos asignando un valor a la estética Y.
De forma predeterminada, varias X que se produzcan en el mismo lugar se apilarán una encima de la otra por position_stack. Si desea que se ubiquen una al lado de la otra, se utiliza position_dodge. Finalmente, position_fill muestra las proporciones relativas en cada X al apilar las barras y, luego, estirarlas o aplastarlas a la misma altura.
Para modificar el título de las leyendas.
Para agregar texto a las barras. Compare con el punto 8.
Ejemplo 5 (Más opciones para construir el mismo diagrama)
Observe el código de abajo (las opciones numeradas se explican en el ejemplo 6)
Tabla <- datosCompleto %>% group_by(Sexo) %>% summarise(Total=n()) %>%
dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1)) #16
ggplot(Tabla, aes(x = Sexo, y=Total,fill=Sexo) ) +
geom_bar(width = 0.9, stat="identity", position = position_dodge())+
ylim(c(0,300))+
labs(x="Género de los estudiantes", y= "Frecuencia \n (Porcentajes)") + #17
labs(fill = "")+
geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%",")")), #18
vjust=-0.9,
color="black",
hjust=0.5,
position = position_dodge(0.9),
angle=0,
size=4.0
) +
scale_fill_discrete(name = "Género", labels = c("Mujer", "Hombre")) + #19
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) + #20
#theme_bw(base_size = 14) +
facet_wrap(~"Variable Sexo")
Ejemplo 6: Descripción de las capas en el ejemplo 5
Consideremos el código presentado en el ejemplo 5.
Ahora, la tabla de frecuencias tiene los porcentajes.
Observe que, en la etiqueta de Y, se ha utilizado “” para hacer un quiebre de línea.
En geom_text() se han agregado las frecuencias y los porcentajes. Para ello, se ha utilizado la función paste0(), colocando los argumentos que quiero pegar, separados de coma. Con angle se le puede dar rotación al texto.
Para editar los título de las leyendas y de los niveles de la variable. Si se escoge esta capa, inmediatamente se anula el argumento que se anote en la opción explicada en el punto 14.
Para rotar y ajustar etiquetas en el eje X.
Ejemplo 7 (cambiando opciones)
Observe el código de abajo (las descripciones de las capas se dejan al lector).
Tabla <- datosCompleto %>% group_by(Sexo) %>% summarise(Total=n()) %>% #21
dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1)) #22
ggplot(Tabla, aes(x = Sexo, y=Total, fill=Sexo) ) + #23
geom_bar(width = 0.9, stat="identity", position = position_dodge())+ #24
ylim(c(0,300))+ #25
labs(x="Género de los estudiantes", y= "Frecuencia \n (Porcentajes)") + #26
labs(fill = "")+ #27
geom_text(aes(label=paste0(Total," ", "", "\n(", Porcentaje, "%",")")), #28
vjust=1.3, #29
color="black", #30
hjust=0.5, #31
position = position_dodge(0.9), #32
angle=0, #33
size=4.0 #34
) +
scale_fill_discrete(name = "Género", labels = c("Mujer", "Hombre")) + #35
theme(axis.text.x = element_text(angle = -45, vjust = 1, hjust=-0.3)) + #36
theme_linedraw() + #37
theme(legend.position = "left") + #38
facet_grid(~"Diagrama de barras para la variable Sexo") #39
Ejemplo 8 (gráfico orientado)
Observe el código de abajo. Compare con el del ejemplo 6 (las descripciones de las capas se dejan al lector).
Tabla <- datosCompleto %>% group_by(Sexo) %>% summarise(Total=n()) %>% #21
dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1)) #22
ggplot(Tabla, aes(x = Sexo, y=Total,fill=Sexo) ) + #23
geom_bar(width = 0.9, stat="identity", position = position_dodge())+ #24
ylim(c(0,300))+ #25
labs(x="Género de los estudiantes", y= "Frecuencia \n (Porcentajes)") + #26
labs(fill = "")+ #27
geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%",")")), #28
vjust=0.5, #29
color="black", #30
hjust=1.2, #31
#position = position_dodge(1.9), #32
angle=0, #33
size=4.0 #34
) +
scale_fill_discrete(name = "Género", labels = c("Mujer", "Hombre")) + #35
theme(axis.text.x = element_text(angle = -45, vjust = 1, hjust=-0.3)) + #36
theme_light() + #37
theme(legend.position = "topleft") + #38
facet_grid(~"Diagrama de barras para la variable Sexo") + #39
coord_flip() #40
Reordenar los grupos en un gráfico de ggplot2 puede ser complicado. Esto se debe al hecho de que ggplot2 tiene en cuenta el orden de los niveles de los factores, pero no el orden que observa en su data frame. Uno puede intentar organizar nuestros datos con sort o arrange, pero la salidad de ggplot2 no tendrá impacto alguno en nuestro objetivo. Explicaremos dos métodos hacerlo. A través de:
Método 1: usando solo dplyr.
Método 2: usando la librería forecats
Presntaremos algunos ejemplos, los cuales están basados en el data frame que se indica en el ejemplo 9.
Ejemplo 9 (nuestro data frame)
#A) Estableciendo nuestra semilla
set.seed(0)
#B) Conjunto de datos 1
datos <- data.frame(Letras = c("A","B","AC","BD","AD","BC","C","D"),
Valores = sample(seq(1,10), 8 ) )
Se va a utilizar arrange para ordenar el data frame y reordenar el factor siguiendo este orden deseado. Es importante resaltar que esta función clasifica el data frame, pero no los niveles del factor. Con arrange(desc(…)), el data frame se ordena descendemente según el factor. Luego, se aplicará la función mutate de dplyr para crear una nueva variable o modificar una existente. También, es posible usarlo para recrear un factor con un orden específico. Se mostrarán 2 ejemplos:
En el primero, utilizaremos a mutate para actualizar los niveles de los factores. Ver ejemplo 10.
En el segundo, utilizaremos a mutate con el fin de especificar un orden personalizado para el factor que da los niveles uno por uno. Ver ejemplo 11.
Ejemplo 10 (dplyr :: arrange)
Se va a utilizar arrange y arrange(desc(…)) para ordenar el data frame y reordenar el factor siguiendo este orden deseado. Una variación del diagrama de barras es el diagrama de piruletas (lollipop plot) que reemplaza las barras con un segmento y un punto.
# GRÁFICO 1
datos %>% arrange(Valores) %>% #A) Ascendente
mutate(Letras=factor(Letras, levels=Letras)) %>% #B) Actualizar niveles del factor
ggplot(aes(x=Letras, y=Valores)) +
geom_segment(aes(xend=Letras, yend=0)) +
geom_point(size=4, color="darkblue") +
coord_flip() +
theme_bw() +
xlab("") +
ylim(c(0,12))
# GRÁFICO 2
datos %>% arrange(desc(Valores)) %>% #C) Descendente
mutate(Letras=factor(Letras, levels=Letras)) %>% #D) Actualizar niveles del factor
ggplot(aes(x=Letras, y=Valores)) +
geom_segment(aes(xend=Letras, yend=0)) +
geom_point(size=4, color="darkred") +
coord_flip() +
theme_bw() +
xlab("") +
ylim(c(0,12))
Ejemplo 11 (dplyr :: orden específico)
En este ejemplo, se utiliza mutate con el fin de especificar un orden personalizado para el factor que da los niveles uno por uno.
datos %>%
arrange(Valores) %>%
mutate(Letras = factor(Letras, levels=c("A", "AC", "C", "BC", "B", "BD", "D", "AD"))) %>%
ggplot( aes(x=Letras, y=Valores)) +
geom_segment( aes(xend=Letras, yend=0)) +
geom_point( size=4, color="darkgreen") +
theme_bw() +
xlab("")+
ylim(c(0,12))
La librería forecats pertenece a tidyverse, especialmente diseñada para manejar factores en R. Vamos a presentar dos ejemplos, en donde la función mutate va actuar sobre las funciones para fact_reorder y fact_relevel con el fin de crear nuevas variables en el data frame.
fct_reorder(name, val)
fct_relevel(name, "un_nivel", "otro_nivel",...)
Ejemplo 12 (forecats :: fct_reorder)
Observe el código de abajo (las descripciones de las capas se dejan al lector).
# Cargando la librería
library(forcats)
# Ordenando de acuerdo al valor de la otra columna:
datos %>%
mutate(Letras = fct_reorder(Letras, Valores)) %>%
ggplot( aes(x=Letras, y=Valores)) +
geom_bar(stat="identity", fill="red", alpha=.6, width=.4) +
coord_flip() +
xlab("") +
theme_bw() +
ylim(c(0,12))
# En forma descendente:
datos %>%
mutate(Letras = fct_reorder(Letras, desc(Valores))) %>%
ggplot( aes(x=Letras, y=Valores)) +
geom_bar(stat="identity", fill="darkblue", alpha=.6, width=.4) +
coord_flip() +
xlab("") +
theme_bw() +
ylim(c(0,12))
Ejemplo 13 (forecats :: fct_relevel)
La última operación común es proporcionar un orden específico a los niveles. Se puede hacer usando la función fct_relevel, de la siguiente manera:
#A) Reordenando con un orden específico:
datos %>% mutate(Letras = fct_relevel(Letras,
"A", "AC", "C", "BC", "B", "BD", "D", "AD")) %>%
#B) El diagrama de barras:
ggplot( aes(x=Letras, y=Valores, fill=Letras)) +
geom_bar(stat="identity") +
xlab("")
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:
Todas las personas.
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 :: Diagrama de barras con ggplot2 (por grupos). También, se puede revisar el documento Bar charts.
plot_grid es una función de la librería cowplot. Permite arreglar varias gráficas en una cuadrícula.
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.
Con labels=c(…) se especifican las etiquetas para cada gráfica.
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.
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.
Algunas veces, los gráficos no están alineados. En muchos casos se pueden alinear mediante la opción align.
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 (con rel_widths y rel_heights, respectivamente).
Crear cuadrículas de gráficas anidadas.
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.
Barra1 <- ggplot(datosCompleto, aes(x = Sexo, fill= Sexo)) +
geom_bar(width=0.5, colour="red") +
labs(x="Sexo",y= "Frecuencia") +
ylim(c(0,300))
Barra2 <- ggplot(datosCompleto, aes(x = Fuma, fill=Fuma)) +
geom_bar(width=0.5, colour="red") +
labs(x="Fuma",y= "Frecuencia") +
ylim(c(0,300)) +
coord_flip()
plot_grid(Barra1, Barra2, 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 diagrama (a la izquierda).
Barra3 <- ggplot(datosCompleto, aes(x = IDARE1.5, fill=IDARE1.5)) +
geom_bar(width=0.5, colour="red") +
labs(x="IDARE1.5",y= "Fecuencia") +
ylim(c(0,300))+
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))
plot_grid(Barra1, Barra2, Barra3, nrow = 2, ncol=2, labels="AUTO")
Ejemplo 16: Tres gráficas en una cuadrícula de (1x2)x1
En el ejemplo anterior, el tercer diagrama de barra se puede centrar como se muestra abajo.
g1 <- plot_grid(Barra1, Barra2, nrow = 1, ncol=2, labels="AUTO", align="h", label_size=10)
plot_grid(g1, Barra3, 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).
Barra4 <- ggplot(datosCompleto, aes(x = factor(Estrato), fill=factor(Estrato))) +
geom_bar(width=0.5, colour="red") +
labs(x="Estrato",y= "Fecuencia", fill="Estrato") +
ylim(c(0,300))
g2<-plot_grid(Barra1, Barra2, nrow = 1, ncol=2, labels = c('A','B'))
g3 <- plot_grid(Barra3, Barra4, nrow = 1, ncol=2, labels = c('D','E'))
plot_grid(g2, g3, nrow = 2, ncol=1)
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.
ggplot2 - Easy way to mix multiple graphs on the same page: click aquí.
Arranging multiple grobs on a page: click aquí.
Ejemplo 18 (grid.arrange)
library(gridExtra)
grid.arrange(Barra1, Barra2, nrow = 1)
Crear un nuevo documento R Markdown, realizando las siguientes actividades con ayuda de ggplot2:
Crear un cuatro (4) diagramas de barras simple con otras variables categóricas, “jugando” con sus propiedades.
Unir los gráficos con la función plot_grid, “jugando” con las opciones de la función.
Unir gráficos con otras funciones.
En todos los casos, interprete los resultados y diagramas resultantes.
LLinás, H., Rojas, C. (2005); Estadística descriptiva y distribuciones de probabilidad. Barranquilla: Editorial Universidad del Norte.
Consultar el documento RPubs :: Enlace y materiales de ayuda.
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.