3.6 Manipulación de gráficos

En esta sección listamos algunas recomendaciones útiles para hacer que nuestros gráficos logren comunicar información mejor. Esto es importante cuando uno usa gráficos en el contexto de un reporte o presentación.

Rotulación

Uno de los aspectos más importantes para elaborar un gráfico efectivo es que quien lo lea entienda claramente qué información está siendo representada en este. Para esto es preciso rotular claramente cada elemento de un gráfico.

En ggplot usamos el comando labs(), el cual recibe como argumentos posibles:

  • title: permite cambiar el título del gráfico.
  • subtitle: permite cambiar el subtítulo del gráfico.
  • caption: permite crear una breve descripción del gráfico (llamada caption en Inglés).
  • x: permite cambiar el nombre del eje x en el gráfico.
  • y: permite cambiar el nombre del eje y en el gráfico.
  • El nombre de alguna estética (como color, fill, shape, etc.): permite cambiar el título de la leyenda asociada a una estética (objeto que explica cómo están representados los valores según dicha estética).

A modo de ejemplo, veamos cómo rotular de manera más clara el siguiente gráfico de dispersión que compara la profundidad del pico de un pinguino con su largo del pico, para distintas especies.

penguins %>% 
  ggplot(aes(x = bill_depth_mm, y = bill_length_mm, color = species)) +
  geom_point()

A continuación una versión rotulada del mismo gráfico:

penguins %>% 
  ggplot(aes(x = bill_depth_mm, y = bill_length_mm, color = species)) +
  geom_point() +
  labs(title = "Largo y Profundidad de Pico",
       subtitle = "Medidos en Pingüinos del Archipiélago de Palmer, Antártica",
       caption = "Datos recolectados durante 2007 - 2009 por la Dra. Kristen Gorman, 
       junto con el Programa de Investigación Ecológica a Largo Plazo de la 
       Estación Palmer (LTER).",
       x = "Produnfidad de Pico (mm)",
       y = "Largo de Pico (mm)",
       color = "Especie de Pingüino")

La meta al rotular un gráfico es conseguir que si copiamos y pegamos este gráfico en un documento en blanco (sin todo el código que lo generó), se pueda entender perfectamente. Es decir, que esté autocontenido.

Te recomendamos siempre detenerte a rotular claramente los gráficos que serán usados en un informe o presentación. Esto puede ser incluso más importante que colores u otros aspectos estéticos.

Rotación de las etiquetas de un eje

Veamos por ejemplo, la distribución de la variable species (especie) de los personajes en la tabla de datos starwars. Nota que primero agrupamos por especie y contamos el número de filas en cada grupo:

starwars %>%
  ggplot(aes(x = species)) + 
  geom_bar()

El gráfico tiene un problema: es imposible ver los nombres de las especies en el eje horizontal. Para resolver esto podemos rotar las etiqueta, agregando el comando guides():

starwars %>%
  ggplot(aes(x = species)) + 
  geom_bar() +
  guides(x = guide_axis(angle = 45))

El parámetro angle es el ángulo en el que se rotan las etiquetas.

Intercambio de ejes

Usamos el comando coord_flip():

starwars %>%
  group_by(species) %>% 
  summarise(conteo = n()) %>% 
  ggplot(aes(x = species, y = conteo)) + 
  geom_col() +
  coord_flip()

Cambiar el número de ticks en un eje

starwars %>%
  group_by(gender) %>% 
  summarise(conteo = n()) %>% 
  ggplot(aes(x = gender, y = conteo)) + 
  geom_col() +
  labs(title = "Género de los personjes de Starwars",
       x = "Género",
       y = "Cantidad") + #Título de nuestros ejes 
  scale_y_continuous(breaks=seq(0, 100, 5)) # Que parta del 0 que llegue hasta el 100 y que vaya en intervalos de 5

Cambiar el formato de números en ejes

Supongamos que tenemos la siguiente base de datos con valores numéricos grandes:

datos_grandes <- tibble(Nombre = c("Bob", "Ana", "Jes"),
                        Valor = c(2023889, 5998300, 3700112))

datos_grandes
## # A tibble: 3 × 2
##   Nombre   Valor
##   <chr>    <dbl>
## 1 Bob    2023889
## 2 Ana    5998300
## 3 Jes    3700112

Es usual que al graficar estos datos, por ejemplo en un gráfico de columnas, ggplot2 utilice notación científica para las etiquetas de los ejes:

datos_grandes %>% 
  ggplot(aes(x = Nombre, y = Valor)) +
  geom_col()

Podemos cambiar esto de dos maneras:

  1. Usando el comando scale_y_continuous(), junto con el argumento labels = scales::label_comma():
datos_grandes %>% 
  ggplot(aes(x = Nombre, y = Valor)) +
  geom_col() +
  scale_y_continuous(labels = scales::label_comma())

Para más maneras de cambiar el formato de las etiquetas de un eje (porcentaje, moneda, etc.), recomendamos consultar la siguiente sección del libro ggplot2: Elegant Graphics for Data Analysis.

  1. Cambiando manualmente la escala del eje en cuestión, para mejorar la legibilidad. En este caso es importante dejar plasmado en el gráfico el cambio de escala realizado.
datos_grandes %>%
  mutate(Valor = Valor/1000000) %>% 
  ggplot(aes(x = Nombre, y = Valor)) +
  geom_col() +
  labs(y = "Valor (millones)")

Anotaciones al cuerpo del gráfico

starwars %>%
  group_by(gender) %>% 
  summarise(conteo = n()) %>% 
  ggplot(aes(x = gender, y = conteo)) + 
  geom_col() +
  labs(title = "Género de los personjes de Starwars",
       x = "Género",
       y = "Cantidad") + #Título de gráfico y ejes 
  geom_text(data = NULL, x = 3, y = 40, label = "Esto es una anotación")

Podemos agregar una etiqueta con las cantidades a las columnas de cada especie

starwars %>%
  group_by(gender) %>% 
  summarise(conteo = n()) %>% 
  ggplot(aes(x = gender, y = conteo)) + 
  geom_col() +
  labs(title = "Género de los personjes de Starwars",
       x = "Género",
       y = "Número") + #Título de nuestros ejes
  geom_text(aes(label=conteo), size=5, color="black", vjust = -0.2)

Cambiar la paleta de colores

starwars %>%
  group_by(gender) %>% 
  summarise(conteo = n()) %>% 
  ggplot(aes(x = gender, y = conteo)) + 
  geom_col() +
  labs(title = "Género de los personjes de Starwars",
       x = "Género",
       y = "Porcentaje") + #Título de nuestros ejes 
  theme(plot.title = element_text(family="Times New Roman",
                                     size=rel(1), #Tamaño relativo de la letra del título
                                     vjust=2, #Justificación vertical, para separarlo del gráfico
                                     face="bold", #Letra negrilla. Otras posibilidades "plain", "italic", "bold" y "bold.italic"
                                     color="green", #Color del texto
                                     lineheight=1.5)) + #Separación entre líneas
  theme(axis.title.x = element_text(face="bold", vjust=-0.5, colour="orange", size=rel(0.75))) +
  theme(axis.title.y = element_text(face="bold", vjust=1.5, colour="blue", size=rel(0.75))) 
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family
## not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database

Exportar un gráfico

Una manera simple y efectiva de usar imágenes generadas por ggplot2 en informes o presentaciones (no generadas con RMarkdown) es realizar capturas de pantalla usando los atajos de teclado de tu computador:

  • Windows: Windows Key + Shift + S
  • MacOS: Command + Control + Shift + 4

Sin embargo, existen ocaciones en que la resolución de las imágenes obenidas no es la mejor. Otra manera de exportar imágenes (que resuelve este problema) es utilizar el comando ggsave() de ggplot2. El formato del archivo de salida puede ser especificado a través del nombre de este.

Veamos un ejemplo:

penguins %>% 
  ggplot(aes(x = bill_depth_mm, y = bill_length_mm, color = species)) +
  geom_point() +
  ggsave("migrafico.png")