Graficar Distribuciones de Probabilidad

Primeros pasos con ggplot2

Introducción y Objetivos

  • Antes de seguir con el tema de distribuciones de probabilidad, vamos a aprender a graficar en R.
  • En esta lección, aprenderemos a graficar distribuciones de probabilidad en R con el paquete ggplot2, el cual es parte del tidyverse.
  • Comenzaremos graficando un histograma, que es una forma común de visualizar la distribución de una variable continua.
  • Al ser parte del tidyverse, ggplot2 sigue una estructura lógica y consistente que facilita la creación de gráficos complejos.

Antes de Empezar

  • Primero tenemos que instalar y cargar el paquete ggplot2. Si no lo tienes instalado, puedes hacerlo con el siguiente comando: install.packages("ggplot2").
  • Luego, cargamos el paquete con library(ggplot2) o bien, puedes cargar todos los paquetes del tidyverse con library(tidyverse).
  • A continuación, iremos paso por paso en la construcción del gráfico con ggplot. Una vez que entiendas esta base, verás que graficar cualquier tipo de gráfico en R es muy similar.

Paso 1. Cargar la librería

  • Primero, tenemos que cargar el paquete ggplot2 con library(ggplot2).
  • Ahora, para decirle a R que queremos hacer un gráfico con ggplot2, usamos la función ggplot().
  • Corre el siguiente código para crear un objeto ggplot vacío.

Paso 2. Generar datos

  • Ahora, necesitamos decirle a ggplot qué datos queremos graficar y cómo queremos visualizarlos.
  • Para este ejercicio, vamos a crear un dataset de ejemplo con 1000 datos que siguen una distribución normal.
  • Esto es fácil en R con la función rnorm(), que genera datos aleatorios de una distribución normal. Esta función toma tres argumentos: el número de datos que queremos, la media y la desviación estándar. Recuerda que la media y la desviación estándar son parámetros que definen la distribución normal.
  • En la siguiente diapositiva se explica más a detalle el código que se muestra a continuación.

  • set.seed(42) fija la semilla para que los resultados sean reproducibles. Se utiliza para generar números aleatorios, pero de manera controlada para que siempre obtengamos los mismos resultados. El valor específico (42) es arbitrario, pero mientras sea el mismo, los resultados serán los mismos.
  • rnorm(1000, mean = 50, sd = 10) genera 1000 datos de una distribución normal con media 50 y desviación estándar 10.
  • head() y tail() muestran los primeros y últimos datos, respectivamente.
  • as.data.frame() convierte los datos en un dataframe, que es el formato que ggplot2 espera.

Paso 3. Pasar datos a ggplot

  • Ahora que tenemos nuestros datos, vamos a crear un histograma con ggplot2.
  • Empezamos por decirle a ggplot() estos dos argumentos:
    • data: el dataset que queremos graficar.
    • aes(): las estéticas (aesthetics) del gráfico, como qué variable va en el eje x o y. Como estamos haciendo un histograma, solo necesitamos especificar la variable x.
  • Ahora, cuando corras el siguiente código, verás un gráfico vacío con el eje que especificamos.
  • Sin embargo, todavía no le hemos dicho a ggplot cómo queremos visualizar los datos. Eso lo haremos en el siguiente paso.

Paso 4. Especificar tipo de gráfico

  • Ahora que hemos especificado los datos y las estéticas, necesitamos agregar lo que se conoce como una capa geométrica (geom layer) al gráfico.
  • Esta capa determina cómo se visualizan los datos (tipo de gráfico). Para un histograma, usamos geom_histogram().
  • Nota que agregamos esta nueva capa con el signo + al final de la línea anterior. Esto nos permite agregar múltiples capas al gráfico si es necesario, sumando capas una tras otra. Conceptualmente es similar a cómo funciona el operador pipa %>%, pero específico de ggplot2.
  • Puedes observar todos los tipos de capas geométricas que ggplot2 ofrece en la documentación oficial. No te preocupes, veremos más de ellas en futuras lecciones.
  • Por el momento, solo necesitas saber que cada capa tiene parámetros específicos. Por ejemplo, para geom_histogram(), podemos especificar el número de bins (contenedores) que queremos en el histograma. Esto determina cuántas barras tendrá el gráfico.

Pequeño paréntesis

  • ¿Cómo afecta el número de contenedores (bins) al histograma?
  • Cambia el número de contenedores en el siguiente código y observa cómo se modifica el gráfico. Para esto, corre el código y mueve el control deslizante en la parte inferior para cambiar el número de contenedores.
  • Idealmente, el número de contenedores debe ser suficiente para capturar la forma de la distribución, pero no demasiado para perder la información.
  • Observa que pasa si el número de contenedores es muy bajo o muy alto.

Paso 5. Asignar el gráfico a un objeto

  • Es buena práctica guardar el gráfico en un objeto para poder modificarlo más adelante, combinarlo con otros gráficos, o guardarlo como un archivo.
  • Esto también será útil cuando empezamos a crear gráficos más complejos con múltiples capas para que el código sea más legible.
  • Para esto, simplemente asignamos el código del gráfico a un objeto, como se muestra a continuación.

Observa que ahora podemos llamar el objeto histograma_ggplot para mostrar el gráfico sin necesidad de volver a escribir todo el código.

Paso 6. Personalizar el gráfico

  • Finalmente, podemos personalizar el gráfico agregando títulos, etiquetas, colores, etc.
  • Vamos a agregar un título al gráfico y etiquetas a los ejes x e y.
  • Para esto, llamamos al objeto histograma_ggplot y agregamos la función labs() (labels o etiquetas) y especificamos el título y las etiquetas que queremos.

Ejemplo Práctico: Alturas de Jirafas

  • Vamos a regresar al ejemplo de las jirafas para entender cómo se aplican estos conceptos en la práctica.
  • Nuestro dataframe se llama alturas_df (ya está cargado en la diapositiva) y tiene las columnas altura en cm e isla con dos categorías (isla #1, isla #2).

  • Siguiendo la estructura básica que ya conocemos, vamos a crear un histograma con los datos de las jirafas (alturas_df).
  • Queremos ver cómo se distribuyen las alturas (altura) de las jirafas en las dos islas.
  • Nota que ahora usam binwidth = 1 en geom_histogram() para especificar el ancho de las barras del histograma. Puedes experimentar con diferentes valores para ver cómo cambia el gráfico. En la próxima diapositiva está la solución.

solución

ggplot(data = alturas_df, 
        aes(x = altura)) +
  geom_histogram(binwidth = 1)

  • El gráfico es un buen comienzo, pero podemos mejorarlo.
  • Vamos a decirle a ggplot que cada isla tenga un color diferente.
  • Para esto, agregamos fill = isla dentro de aes().
  • Esto le dice a ggplot que queremos que cada barra del histograma se llene con un color diferente según el tipo de isla, almacenado en la variable llamada “isla”.

Nota

  • fill = isla le dice a ggplot que queremos que cada barra del histograma se llene con un color diferente según el tipo de isla.
  • No confundir fill con colorfill se refiere al relleno de las barras, mientras que color se refiere al contorno de las barras.
  • Observa la diferencia si cambias fill por color en el código.

  • Ahora, vamos a especificar colores específicos que queremos para cada isla en lugar de los colores predeterminados.
  • Para esto, agregamos una capa adicional con + scale_fill_manual() al gráfico.
  • Dentro de esta función, especificamos los colores que queremos para cada isla de la siguiente manera: values = c("color1", "color2").
    • Nota que estamos concatenando los colores con c(). Esto es importante para que R entienda que son dos colores diferentes. Ten en cuenta que debes proporcionar tantos colores como categorías tengas en tu gráfico, en este caso, dos.
    • Los colores pueden ser especificados de distinas maneras. Puedes usar palabras como red, blue, green, yellow, black, white, entre otros. También puedes usar códigos hexadecimales como #FF0000 para rojo, #0000FF para azul, etc.
    • Conoce todos las palabras de colores que se pueden usar en este enlace y los códigos hexadecimales en este enlace.

  • Ahora, corre el siguiente código para ver el histograma con los colores que quieras. Sustituye los valores faltantes (marcados con ------) con los colores que prefieras.

tip

  • Una forma facil de modificar la apariencia del gráfico es utilizando temas predefinidos.
  • Puedes conocer los diferentes temas que ggplot2 ofrece en la documentación oficial.
  • En el siguiente código, comenta y descomenta las líneas para ver cómo cambia la apariencia del gráfico con los diferentes temas.
  • Nota: solamente puedes tener un tema activo a la vez. Si quieres cambiar el tema, comenta la línea del tema actual y descomenta la del nuevo tema.

  • Finalmente, podemos agregar títulos y etiquetas a nuestro gráfico para hacerlo más informativo.
  • Para facilitar el trabajo con multiples capas, podemos guardar el gráfico en un objeto y luego agregar las capas adicionales.

  • Agregar títulos y etiquetas al gráfico. Reemplaza los guiónes bajos con los textos que prefieras.
  • Recuerda que en un gráfico, los ejes x e y deben tener etiquetas descriptivas que indiquen qué variable están representando.
  • Nota que estamos utilizando el objeto p que creamos anteriormente. Seguimos agregando capas al gráfico con el operador + y lo seguimos guardando en el objeto p para futuras modificaciones.
  • Para mostrar el gráfico, simplemente llamamos al objeto p o bien, puedes usar print(p).

Expande para ver el código completo

Una forma de nombrar las etiquetas del gráfico podría ser la siguiente:

p <- p +
  labs(title = "Distribución de Alturas de Jirafas",
       x = "Altura (cm)",
       y = "Frecuencia")

p

Ahora, quitemos el espacio en blanco alrededor del gráfico para hacerlo más limpio y movamos la leyenda a la parte superior. - NOTA: en lugar de usar legend.position = "top", también puedes usar los valores bottom, left, right, none.

  • Por último, podemos guardar el gráfico como un archivo de imagen para compartirlo o incrustarlo en un documento.
  • Para esto, usamos la función ggsave(). Esta función toma varios argumentos: primero, el nombre del archivo que queremos guardar (por ejemplo, "histograma_jirafas.png"), luego el objeto del gráfico que queremos guardar (en este caso, p), y finalmente, el ancho, alto y resolución de la imagen (300 dpi es una resolución estándar para impresión).
  • En este caso no se va a guardar el archivo, pero si lo haces en tu computadora se salvaría en la carpeta de trabajo con el nombre que le diste.
ggsave("histograma_jirafas.png", plot = p, width = 8, height = 6, dpi = 300)

Fin