Gráficos con ggplot2: algunos gráficos sencillos

Módulo práctico de ITA
(Grupo M)

Pedro J. Pérez

primero, los datos

Queremos ver cómo ha evolucionado la esperanza de vida en España. Así que primero nos quedamos con las filas de España:

df_spain <- gapminder %>%
  filter(country == "Spain")
gt::gt(head(df_spain, n = 6))
country continent year lifeExp pop gdpPercap
Spain Europe 1952 64.94 28549870 3834.035
Spain Europe 1957 66.66 29841614 4564.802
Spain Europe 1962 69.69 31158061 5693.844
Spain Europe 1967 71.44 32850275 7993.512
Spain Europe 1972 73.06 34513161 10638.751
Spain Europe 1977 74.39 36439000 13236.921

  • Tenemos una fila por año: en el eje X pondremos el año (year) y en el eje Y la esperanza de vida (lifeExp)

un gráfico de líneas, paso a paso

ggplot(data = df_spain) +
ggplot(data = df_spain) +
  aes(x = year) +
ggplot(data = df_spain) +
  aes(x = year) +
  aes(y = lifeExp) +
ggplot(data = df_spain) +
  aes(x = year) +
  aes(y = lifeExp) +
  geom_line() +
ggplot(data = df_spain) +
  aes(x = year) +
  aes(y = lifeExp) +
  geom_line() +
  geom_point() +
ggplot(data = df_spain) +
  aes(x = year) +
  aes(y = lifeExp) +
  geom_line() +
  geom_point() +
  labs(title = "Evolución de la esperanza de vida (España)",
       x = NULL,
       y = "años")

labs() pone el título del gráfico y los nombres de los ejes

  • Con NULL, el eje x se queda sin nombre

varias líneas: una por país

Queremos comparar varios países.

Fíjate en color = country. Está dentro de aes(), así que el color depende de la variable country; por lo tanto, tendremos un color de linea por país

df_paises <- gapminder %>%
  filter(country %in% c("Spain", "France",
                        "United States", "Japan"))

ggplot(data = df_paises,
       aes(x = year, y = lifeExp,
           color = country)) +
  geom_line()

¿Qué pasará si quitas color = country? Pruébalo. ¿Ves el problema? ggplot2 uniría todos los puntos con una sola línea

primero, los datos

¿Los países más ricos tienen una esperanza de vida más alta? Para verlo nos quedamos con un solo año, el último (2007): así tenemos un punto por país

df_2007 <- gapminder %>%
  filter(year == 2007) %>%
  mutate(pob_millones = pop / 1000000)

nrow(df_2007)  #- 142 países: 142 puntos
#> [1] 142

  • En el eje X pondremos la renta per cápita (gdpPercap) y en el eje Y la esperanza de vida (lifeExp)

  • … y como tenemos más variables, podemos usar más estéticas: el color para el continente y el tamaño de los puntos para la población (en millones, para que la leyenda se lea mejor)

un gráfico X-Y, paso a paso

ggplot(data = df_2007) +
ggplot(data = df_2007) +
  aes(x = gdpPercap) +
ggplot(data = df_2007) +
  aes(x = gdpPercap) +
  aes(y = lifeExp) +
ggplot(data = df_2007) +
  aes(x = gdpPercap) +
  aes(y = lifeExp) +
  geom_point() +
ggplot(data = df_2007) +
  aes(x = gdpPercap) +
  aes(y = lifeExp) +
  geom_point() +
  aes(color = continent) +
ggplot(data = df_2007) +
  aes(x = gdpPercap) +
  aes(y = lifeExp) +
  geom_point() +
  aes(color = continent) +
  aes(size = pob_millones) +
ggplot(data = df_2007) +
  aes(x = gdpPercap) +
  aes(y = lifeExp) +
  geom_point() +
  aes(color = continent) +
  aes(size = pob_millones) +
  labs(title = "Renta y esperanza de vida (2007)",
       x = "renta per cápita",
       y = "esperanza de vida")

geom_col(): la altura de las barras ya la tenemos

Queremos un gráfico con la población de cada continente en 2007. Primero la calculamos (¿te acuerdas de group_by() + summarise()?) y después hacemos el gráfico

df_pob <- df_2007 %>%
  group_by(continent) %>%
  summarise(pob = round(sum(pop) / 1000000))

gt::gt(df_pob)
continent pob
Africa 930
Americas 899
Asia 3812
Europe 586
Oceania 25

… y ahora el gráfico:

ggplot(data = df_pob,
       aes(x = continent, y = pob)) +
  geom_col() +
  labs(y = "población (millones)")

  • Con geom_col() la altura de cada barra es un valor que ya está en los datos (aquí, la columna pob)

geom_bar(): ggplot2 cuenta por nosotros

¿Cuántos países hay en cada continente? Aquí no hace falta calcular nada antes: geom_bar() cuenta las filas de cada grupo

Los datos: una fila por país. Vemos las primeras:

df_2007 %>%
  select(continent, country) %>%
  head(n = 8) %>%
  gt::gt()
continent country
Asia Afghanistan
Europe Albania
Africa Algeria
Africa Angola
Americas Argentina
Oceania Australia
Europe Austria
Asia Bahrain

… y el gráfico: geom_bar() cuenta los países de cada continente

ggplot(data = df_2007,
       aes(x = continent)) +
  geom_bar() +
  labs(y = "nº de países")

geom_col() si ya tienes la altura de las barras; geom_bar() si quieres que ggplot2 cuente las filas de cada grupo

barras horizontales (y ordenadas)

Con nombres largos o muchos grupos, las barras horizontales se leen mejor. Basta con poner los grupos en el eje Y. Y con reorder() ordenamos las barras según su valor

ggplot(data = df_pob,
       aes(x = pob,
           y = reorder(continent, pob))) +
  geom_col() +
  labs(x = "población (millones)",
       y = NULL)

  • reorder(continent, pob): ordena los continentes según su población

barras de colores: ¿dentro o fuera de aes()?

En las barras, el color del relleno es la estética fill (color es el color del borde de las barritas). Como siempre, puede ir dentro o fuera de aes():


Dentro de aes(): el color depende de una variable (el continente)

ggplot(data = df_pob, 
       aes(x = continent, y = pob)) +
  geom_col(aes(fill = continent))

Fuera de aes(): todas las barras del mismo color

ggplot(data = df_pob, 
       aes(x = continent, y = pob)) +
  geom_col(fill = "steelblue")

Tarea: haz tú los gráficos

  1. Haz un gráfico de líneas con la evolución de la renta per cápita (gdpPercap) de España, Portugal e Italia


  1. Haz un gráfico de barras con la esperanza de vida media (lifeExp) de cada continente en 2007
  • Para el 1: es igual que el de varios países, pero cambiando los países y la variable del eje Y

  • Para el 2: primero hay que calcular la media de cada continente, con group_by() y summarise(). Después, como ya tienes la altura de las barras, ¿geom_col() o geom_bar()?

df_tarea <- gapminder %>%
  filter(country %in% c("Spain", "Portugal", "Italy"))

ggplot(data = df_tarea, aes(x = year, y = gdpPercap, color = country)) +
  geom_line()

df_tarea <- df_2007 %>%
  group_by(continent) %>%
  summarise(media = mean(lifeExp))

ggplot(data = df_tarea, aes(x = continent, y = media)) +
  geom_col()

primero: guardar el gráfico en un fichero

Lo más cómodo es guardar el gráfico en un fichero de imagen con ggsave()

1p <- ggplot(data = df_spain, aes(x = year, y = lifeExp)) +
  geom_line()

2ggsave("grafico_spain.png",
       plot = p,
3       width = 16, height = 10, units = "cm",
4       dpi = 300)
1
Guardamos el gráfico en un objeto, p
2
El nombre del fichero: la extensión decide el formato (.png, .jpg, .pdf …)
3
El tamaño de la imagen: aquí 16 x 10 cm
4
La resolución: con 300 se ve bien incluso impreso

  • El fichero se guarda en la carpeta del proyecto. Búscalo en la pestaña Files de RStudio

  • Consejo: pon en width y height el tamaño que tendrá el gráfico en el documento. Así las letras salen con un tamaño razonable

llevar el gráfico a Word

  • Una vez tienes el fichero .png, en Word: Insertar > Imágenes > Este dispositivo … y eliges el fichero

  • … o, más fácil aún, arrastras el fichero al documento


un atajo (con truco)

  • En RStudio, en la pestaña Plots: Export > Copy to Clipboard… y después, en Word, Ctrl + V

  • Es más rápido, pero el tamaño y la calidad del gráfico los controlas peor. Para un trabajo que vas a entregar, mejor ggsave()

llevar el gráfico a Excel

Aquí tenemos 2 opciones:

  1. Meter la imagen, igual que en Word: en Excel, Insertar > Imágenes

    • Pero ojo: es una imagen, así que en Excel no podrás cambiar nada del gráfico
  1. Exportar los datos a Excel y hacer allí el gráfico. ¿Te acuerdas de rio::export()?
rio::export(df_pob, "poblacion_continentes.xlsx")
  • Después, en Excel, seleccionas los datos e Insertar > Gráficos. Lo veremos en las slides de Excel

¿Cuál es mejor? Depende: si el gráfico ya está terminado, la imagen; si en Excel lo quieres modificar (o actualizar), los datos

Tarea: exporta tus gráficos

  1. Guarda con ggsave() los dos gráficos de la tarea anterior. Elige tú el tamaño

  2. Abre un documento de Word y mete en él los dos gráficos

  3. Exporta a Excel los datos del gráfico de barras (la esperanza de vida media de cada continente) y haz allí un gráfico de barras


  • ¿Qué te ha resultado más fácil? ¿Y qué gráfico queda mejor, el de R o el de Excel?