R para Ciencia de Datos de Salud

Author

Ewen Harrison y Riinu Pius / traducido por A.Carolina Ledezma-Carrizalez

Capítulo 5 Ajuste fino de Gráficos

5.1 Obtener los datos

Podemos guardar un ggplot()objeto en una variable (normalmente la llamamos ppero puede tener cualquier nombre). Esto luego aparece en la pestaña Entorno. Para dibujarlo, es necesario recuperarlo en una línea separada para que se dibuje (Figura 5.1 ). Guardar un gráfico en una variable nos permite modificarlo más tarde (p. ej., p + theme_bw()).

library(gapminder)
library(tidyverse)
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
✔ ggplot2 3.4.0      ✔ purrr   0.3.4 
✔ tibble  3.1.8      ✔ dplyr   1.0.10
✔ tidyr   1.2.0      ✔ stringr 1.4.0 
✔ readr   2.1.2      ✔ forcats 0.5.1 
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
p0 <- gapminder %>% 
  filter(year == 2007) %>% 
  ggplot(aes(y = lifeExp, x = gdpPercap, colour = continent)) +
  geom_point(alpha = 0.3) +
  theme_bw() +
  geom_smooth(method = "lm", se = FALSE) +
  scale_colour_brewer(palette = "Set1")

p0
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.1: p0: Gráfico inicial para los ejemplos de este capítulo.

5.2 Escalas

5.2.1 Logarítmica

La transformación de un eje a una escala logarítmica se puede hacer agregando scale_x_log10():

p1 <- p0 + scale_x_log10()

scale_x_log10()y scale_x_log10()son atajos para la transformación logarítmica en base 10 de un eje. Lo mismo podría lograrse usando, por ejemplo, scale_x_continuous(trans = “log10”). Este último puede tomar una selección de opciones, a saber “reverse”, “log2”, o “sqrt”. Consulte la pestaña Ayuda scale_continuous()o busque su documentación en línea para obtener una lista completa.

5.2.2 Límites de expansión

Una forma rápida de expandir los límites de su parcela es especificar el valor que desea incluir:

p2 <- p0 + expand_limits(y = 0)

O dos valores para extender a ambos lados de la trama:

p3 <- p0 + expand_limits(y = c(0, 100))

De forma predeterminada, ggplot()agrega algo de relleno alrededor del área incluida (vea cómo la escala no comienza desde 0, sino un poco antes). Esto garantiza que los puntos de los bordes no se superpongan con los ejes, pero en algunos casos, especialmente si ya ha ampliado la escala, es posible que desee eliminar este relleno adicional. Puede eliminar este relleno con el expand argumento:

p4 <- p0 +
  expand_limits(y = c(0, 100)) +
  coord_cartesian(expand = FALSE)

Ahora estamos usando una nueva biblioteca, patchwork , para imprimir los 4 gráficos juntos (Figura 5.2 ). Su sintaxis es muy simple: nos permite agregar objetos ggplot juntos. (Tratar de hacerlo p1 + p2sin cargar el paquete patchwork no funcionará, R dirá “Error: no sé cómo agregar p2 a un gráfico”).

library(patchwork)
p1 + p2 + p3 + p4 + plot_annotation(tag_levels = "1", tag_prefix = "p")
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.2: p1: Usando una escala logarítmica para el eje x. p2: expandir los límites del eje y para incluir 0. p3: expandir los límites del eje y para incluir 0 y 100. p4: eliminar el relleno adicional alrededor de los límites.

5.2.3 Ampliar

p5 <- p0 +
  coord_cartesian(ylim = c(70, 85), xlim = c(20000, 40000)) 

5.2.4 Ejercicio

¿En qué se diferencia éste del anterior (Figura 5.3 )?

p6 <- p0 +
  scale_y_continuous(limits = c(70, 85)) +
  scale_x_continuous(limits = c(20000, 40000)) 

Respuesta: el primero hace zoom, aún conservando información sobre los puntos excluidos al calcular las líneas de regresión lineal. El segundo elimina los datos (como dicen las advertencias), calculando las líneas de regresión lineal solo para los puntos visibles.

p5 + labs(tag = "p5") + p6 + labs(tag = "p6")
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
Warning: Removed 114 rows containing non-finite values (`stat_smooth()`).
Warning: Removed 114 rows containing missing values (`geom_point()`).

FIGURA 5.3: p5: Usar coord_cartesian()vs p6: Usar scale_x_continuous()y scale_y_continuous()para establecer los límites de los ejes del gráfico.

Previamente usamos la función patchworkplot_annotation() para crear nuestras etiquetas multiplot. Dado que nuestros ejemplos ya no comienzan el conteo desde 1, en su lugar usamos ggplot()las etiquetas , por ejemplo, labs(tag = “p5”). La labs()función i se tratará con más detalle más adelante en este capítulo

5.2.5 Marcas de eje

ggplot()hace un buen trabajo al decidir cuántos y qué valores incluir en el eje (por ejemplo, 70/75/80/85 para los ejes y en la figura 5.3 ). Pero a veces querrá especificarlos, por ejemplo, para indicar valores de umbral o un máximo (Figura 5.4 ). Podemos hacerlo usando el breaks argumento:

# Calculando el valor máximo que se incluirá en el freno (Breaks) del eje:

max_value = gapminder %>% 
  filter(year == 2007) %>%
  summarise(max_lifeExp = max(lifeExp)) %>% 
  pull(max_lifeExp) %>% 
  round(1)

# usando scale_y_continuous (breaks = ...):
p7 <-  p0 +
  coord_cartesian(ylim = c(0, 100), expand = 0) +
  scale_y_continuous(breaks = c(18, 50, max_value))

# También podemos incluir etiquetas personalizadas para nuestros frenos (Breaks):
p8 <-  p0 +
  coord_cartesian(ylim = c(0, 100), expand = 0) +
  scale_y_continuous(breaks = c(18, 50, max_value), labels = c("Adults", "50", "MAX"))

p7 + labs(tag = "p7") + p8 + labs(tag = "p8")
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.4: p7: Especificación de freno (Breaks) del eje y. p8: Agregar etiquetas personalizadas para nuestros frenos (Breaks).

5.3 Colores

5.3.1 Uso de las paletas de Brewer:

La forma más fácil de cambiar la paleta de colores de su ggplot()es especificar una paleta Brewer ( Harrower and Brewer ( 2003 ) ):

p9 <- p0 +
  scale_color_brewer(palette = "Paired")
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

Tenga en cuenta que http://colorbrewer2.org/ también tiene opciones para daltónicos y apto para impresión .

5.3.2 Título de la leyenda

scale_colour_brewer()también es un lugar conveniente para cambiar el título de la leyenda (Figura 5.5 ):

p10 <- p0 +
  scale_color_brewer("continente - \n uno de 5", palette = "Paired")
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

Tenga en cuenta el del título de la nueva leyenda - nueva línea.

p9 + labs(tag = "p9") + p10 + labs(tag = "p10")
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.5: p9: Elección de una paleta Brewer para sus colores. p10: Cambiando el título de la leyenda.

5.3.3 Elegir colores manualmente

R también conoce los nombres de muchos colores, por lo que podemos usar palabras para especificar colores:

p11 <- p0 +
  scale_color_manual(values = c("red", "green", "blue", "purple", "pink"))
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

La misma función también se puede usar para usar códigos HEX para especificar colores:

p12 <- p0 +
  scale_color_manual(values = c("#8dd3c7", "#ffffb3", "#bebada",
                                "#fb8072", "#80b1d3"))
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.
p11 + labs(tag = "p11") + p12 + labs(tag = "p12")
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.6: Los colores también se pueden especificar usando palabras ( “red”, “green”, etc.), o códigos HEX ( “#8dd3c7”, “#ffffb3”, etc.).

Referencias

Harrower, Mark y Cynthia A. Brewer. 2003. “ColorBrewer.org: una herramienta en línea para seleccionar esquemas de color para mapas”. El diario cartográfico 40 (1): 27–37. https://doi.org/10.1179/000870403235002042

5.4 Títulos y etiquetas

Hemos estado usando la labs(tag = )función para agregar etiquetas a las parcelas. Pero la labs()función también se puede usar para modificar las etiquetas de los ejes o para agregar un título, subtítulo o una leyenda a su gráfico (Figura 5.7 ):

p13 <- p0 +
  labs(x = "El producto interno bruto per cápita",
       y = "Expectativa de vida",
       title = "Salud y economía",
       subtitle = "Gapminder dataset, 2007",
       caption = Sys.Date(),
       tag = "p13")

p13
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.7: p13: Agregando un título, subtítulo, subtítulo usando labs().

5.4.1 Anotación

En el capítulo anterior, mostramos cómo usar geom_text()y geom_label()agregar elementos de texto a un gráfico. El uso de geoms tiene sentido cuando los valores se basan en datos y variables asignadas en formato aes(). Son eficientes para incluir múltiples piezas de texto o etiquetas en sus datos. Para anotar ‘a mano’ un gráfico, la annotate()función tiene más sentido, ya que puede insertar rápidamente el tipo, la ubicación y la etiqueta de su anotación (Figura 5.8 ):

p14 <- p0 +
  annotate("text",
           x = 25000,
           y = 50,
           label = "¡No hay puntos aquí!")
p15 <- p0 +
  annotate("label",
           x = 25000,
           y = 50,
           label = "¡No hay puntos aquí!")
p16 <- p0 +
  annotate("label",
           x = 25000, 
           y = 50,
           label = "¡No hay puntos aquí!", 
           hjust = 0)
p14 + labs(tag = "p14") + (p15 + labs(tag = "p15"))/ (p16 + labs(tag = "p16"))
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.8: p14: annotate(“text”, …)para agregar rápidamente un texto en su diagrama. p15: annotate(“label”)es similar pero dibuja un cuadro alrededor de su texto (convirtiéndolo en una etiqueta). p16: Usar hjust para controlar la justificación horizontal de la anotación.

hjust significa justificación horizontal. Su valor predeterminado es 0,5 (vea cómo la etiqueta se centró en 25 000, nuestra ubicación x elegida), 0 significa que la etiqueta va a la derecha desde 25 000, 1 haría que terminara en 25 000.

5.4.2 Anotación con un superíndice y una variable

Este es un ejemplo avanzado sobre cómo anotar su gráfico con algo que tiene un superíndice y se basa en un solo valor leído de una variable (Figura 5.9 ):

# Un valor que compensamos para este ejemplo
# Un análisis real lo obtendría del objeto de modelo lineal

fit_glance <- tibble(r.squared = 0.7693465)


plot_rsquared <- paste0(
  "R^2 == ",
  fit_glance$r.squared %>% round(2))


p17 <- p0 +
  annotate("text",
           x = 25000, 
           y = 50,
           label = plot_rsquared, parse = TRUE,
           hjust = 0)

p17 + labs(tag = "p17")
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.9: p17: Uso de un superíndice en la anotación de su diagrama.

5.5 Aspecto general -theme()

Y finalmente, todo lo demás en un gráfico, desde la fuente hasta el fondo y el espacio entre las facetas, se puede cambiar usando la theme()función. Como vio en el capítulo anterior, además de su fondo gris predeterminado, ggplot2 también viene con algunos temas integrados, a saber, theme_bw()o theme_classic(). Estos producen parcelas atractivas que ya pueden estar listas para su publicación. Pero si decidimos modificarlos, entonces los theme()argumentos principales que usamos son axis.text, axis.titley legend.position. 13 Tenga en cuenta que todos estos van dentro de theme(), y que los argumentos axis.texty axis.titlegeneralmente van seguidos de = element_text()como se muestra en los ejemplos a continuación.

5.5.1 Tamaño del texto

La forma en que funcionan los axis.text argumentos axis.title es theme()que si especifica .x o .y se aplica solo en ese eje. Pero al no especificar estos, se aplica el cambio en ambos. Las opciones angle y vjust(justificación vertical) pueden ser útiles si el texto de su eje no encaja bien y se superpone. Por lo general, no tiene sentido cambiar el color de la fuente a otro que no sea “black”, estamos usando verde y rojo aquí para indicar qué partes del gráfico se cambian con cada línea (Figura 5.10 ).

p18 <-  p0 +
  theme(axis.text.y = element_text(colour = "green", size = 14),
        axis.text.x = element_text(colour = "red",  angle = 45, vjust = 0.5),
        axis.title  = element_text(colour = "blue", size = 16)
        )

p18 + labs(tag = "p18")
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.10: p18: Uso de axis.texty axis.titledentro theme()para modificar la apariencia de su gráfico, incluido el tamaño de fuente y el ángulo. La fuente de color se usa para indicar qué parte del código se usó para cambiar cada elemento.

5.5.2 Posición de la leyenda

La posición de la leyenda se puede cambiar usando el legend.positionargumento dentro de theme(). Se puede posicionar usando las siguientes palabras: “right”, “left”, “top”, “bottom”. O para eliminar la leyenda por completo, use “none”:

p19 <- p0 +
  theme(legend.position = "none")

Alternativamente, podemos usar coordenadas relativas (0–1) para darle a la leyenda una ubicación x y relativa (Figura 5.11 ):

p20 <- p0 +
  theme(legend.position      = c(1,0), # esquina inferior derecha
        legend.justification = c(1,0)) 
p19 + labs(tag = "p19") + p20 + labs(tag = "p20")
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.11: p19: El ajuste theme(legend.position = “none”)lo elimina. p20: Coordenadas relativas como las que theme(legend.position = c(1,0)se pueden usar para colocar la leyenda dentro del área de trazado.

Mas alla de theme(legend.)pueden usar otras opciones para cambiar el tamaño, el fondo, el espaciado, etc., de la leyenda. Sin embargo, para modificar el contenido de la leyenda, deberá utilizar la guides()función. Una vez más, ggplot()los valores predeterminados son muy buenos, y rara vez necesitamos hacer tantos ajustes usando las funciones theme()y guides(). Pero es bueno saber lo que es posible.

Por ejemplo, así es como se cambia el número de columnas dentro de la leyenda (Figura 5.12 ):

p21 <- p0 +
  guides(colour = guide_legend(ncol = 2)) +
  theme(legend.position = "top") # moving to the top optional

p21 + labs(tag = "p21")
`geom_smooth()` using formula = 'y ~ x'

FIGURA 5.12: p21: Cambiando el número de columnas dentro de una leyenda.

Para ver una lista completa de posibles argumentos para theme(), navegue hasta ella en la pestaña Ayuda o busque su documentación en línea en https://ggplot2.tidyverse.org/ . ↩︎

5.6 Guardar su PLOT

En los Capítulos 12 y 13 , le mostraremos cómo exportar texto descriptivo, figuras y tablas directamente desde R a Word/PDF/HTML usando el poder de R Markdown. La ggsave()función, sin embargo, se puede utilizar para guardar un solo gráfico en una variedad de formatos, a saber “pdf”o “png”:

ggsave(p0, file = "mi_plot_guardado.pdf", width = 5, height = 4)
`geom_smooth()` using formula = 'y ~ x'

Si omite el primer argumento, el objeto de la trama, y llama, por ejemplo, ggsave(file = “plot.png)solo guardará la última trama que se imprimió.

Consejo sobre el tamaño del texto: jugar con las opciones de ancho y alto (están en pulgadas) puede ser una forma conveniente de aumentar o disminuir el tamaño relativo del texto en el gráfico. Mire los tamaños de fuente relativos de las dos versiones de la ggsave()llamada, una 5x4, la otra 10x8 (Figura 5.13 ):

ggsave(p0, file = "mi_plot_mas grande_guardado.pdf", width = 10, height = 8)
`geom_smooth()` using formula = 'y ~ x'