Programación y manejo de datos con R (Slides 06-A)
Uno de los mejores (¿qué dices?, ¡el MEJOR!) sistemas gráficos del MUNDO.
R tiene varios sistemas gráficos, pero usaremos ggplot2
ggplot2 es un paquete de R para producir gráficos estadísticos. Bueno, en realidad es todo un ecosistema. Mira sus extensiones [aquí].
Es diferente porque tiene una gramática subyacente: la layered grammar of graphics (Wickham, 2010), basada en The Grammar of Graphics (Wilkinson, 2005).
Cuesta un poco (sólo un poco) más empezar, pero enseguida se ven los beneficios; además, es que ahora mismo es el estándar.
Primeras ideas para empezar a familiarizarnos con ggplot2
Importante para entender ggplot2 [ 🌟 ]
Un gráfico tiene 3 componentes principales:
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1 5.1 3.5 1.4 0.2 setosa
#> 2 4.9 3.0 1.4 0.2 setosa
#> 3 4.7 3.2 1.3 0.2 setosa
#> 4 4.6 3.1 1.5 0.2 setosa
#> 5 5.0 3.6 1.4 0.2 setosa
#> 6 5.4 3.9 1.7 0.4 setosa
#- Fíjate: sólo hay 2 variables en aes() ---------------------------------------
ggplot(iris, aes(Sepal.Length, Petal.Length)) +
geom_point()
#- Fíjate: ahora usamos geom_line() --------------------------------------------
ggplot(iris, aes(Sepal.Length, Petal.Length)) +
geom_line()
#- Fíjate: ahora usamos 2 geom_xx() --------------------------------------------
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() +
geom_smooth()
#- Fíjate: volvemos a tener 3 variables asociadas a estéticas ------------------
ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) +
geom_point()
#- Fíjate: hay argumentos dentro de geom_point(). Uno de ellos es "color" ------
ggplot(iris, aes(Sepal.Length, Petal.Length)) +
geom_point(color = "red", size = 2, alpha = 0.2)aes()? [ 🌟 ]Mapear (dentro de aes()): el color depende de una variable → ggplot2 crea una leyenda
aes(): ¿por qué los puntos salen rojos y no azules?Ya tenemos las primeras ideas sobre ggplot2, ahora se trata de profundizar un poco para que podamos tener más control y flexibilidad al hacer nuestros gráficos.
Es importante que veas que estas 3 expresiones hacen el mismo gráfico:
✔ Si utilizas la tercera expresión; es decir, si especificas los datos dentro de geom_xx(), es necesario poner el nombre del argumento: (data = iris , …) [ 🌟 ]
Bueno, sí, ¿y qué más da? Pues importa, y muuuucho.
Esto nos va a dar mucha flexibilidad/control en nuestros gráficos. Lo vemos.
ggplot(iris) + geom_point(aes(Sepal.Length, Petal.Length)) +
geom_smooth(aes(color = Species))
#> Error in `geom_smooth()`:
#> ! Problem while computing stat.
#> ℹ Error occurred in the 2nd layer.
#> Caused by error in `compute_layer()`:
#> ! `stat_smooth()` requires the following missing aesthetics: x and y.
ggplot() + geom_point(data = iris, aes(Sepal.Length, Petal.Length)) +
geom_line(aes(Sepal.Length, Petal.Length))
#> Error in `geom_line()`:
#> ! Problem while computing aesthetics.
#> ℹ Error occurred in the 2nd layer.
#> Caused by error:
#> ! objeto 'Sepal.Length' no encontrado
ggplot(aes(Sepal.Length, Petal.Length)) + geom_point(data = iris) +
geom_line()
#> Error in `fortify()`:
#> ! `data` must be a <data.frame>, or an object coercible by `fortify()`,
#> or a valid <data.frame>-like object coercible by `as.data.frame()`, not a
#> <ggplot2::mapping> object.
#> ℹ Did you accidentally pass `aes()` to the `data` argument?
ggplot() + geom_point(data = iris, aes(Sepal.Length, Petal.Length)) +
geom_line()
ggplot(iris, aes(Sepal.Length, Petal.Length)) |> #- ¡ojo! las capas se unen con +
geom_point()
#> Error in `geom_point()`:
#> ! `mapping` must be created by `aes()`.
#> ✖ You've supplied a <ggplot2::ggplot> object.
#> ℹ Did you use `%>%` or `|>` instead of `+`?iris_2 <- iris |> filter(Species != "setosa") #- lirios que no son "setosa"
ggplot() +
geom_point(data = iris, aes(Sepal.Length, Petal.Length, color = Species)) +
geom_smooth(data = iris_2, aes(Sepal.Length, Petal.Length) )
ggplot(iris, aes(Sepal.Length, Petal.Length)) +
geom_point(aes(color = Species)) + geom_smooth(data = iris_2)Tarea: Quiero que las 2 especies de lirios grandes (versicolor y virginica) se representen con el mismo color, ¿cómo lo hago?
Hay varias soluciones, una de las más marcianas es la Solución 1.
iris_2 <- iris |> filter(Species != "setosa") #- lirios grandes
iris_solo_setosa <- iris |> filter(Species == "setosa") #- lirios pequeños ("setosa")
ggplot(iris, aes(Sepal.Length, Petal.Length)) + geom_point() +
geom_point(data = iris_solo_setosa, aes(color = Species)) +
geom_smooth(data = iris_2, aes(Sepal.Length, Petal.Length) )iris_solo_setosa <- iris |> filter(Species == "setosa")
iris_solo_2_clases <- iris |>
mutate(Species_2 = ifelse(Species %in% c("versicolor", "virginica"),
"lirios_grandes", "setosa"))
ggplot(iris, aes(Sepal.Length, Petal.Length)) +
geom_point() +
geom_point(data = iris_solo_setosa, aes(color = Species)) +
geom_smooth(data = iris_solo_2_clases,
aes(Sepal.Length, Petal.Length, color = Species_2) )ggplot(iris, aes(Sepal.Length, Petal.Length)) +
geom_point() + geom_smooth()
ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) +
geom_point() + geom_smooth()
ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) +
geom_point(color = "purple") + geom_smooth()
ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) +
geom_point() + geom_smooth(color = "brown")
ggplot(iris, aes(Sepal.Length, Petal.Length)) +
geom_point() + geom_smooth(aes(color = Species))
ggplot(iris) +
geom_point(aes(Sepal.Length, Petal.Length, color = Species) ) +
geom_smooth(aes(Sepal.Length, Petal.Length, color = Species))ggplot(iris, aes(Sepal.Length, Petal.Length, color = Species)) +
geom_point(color = "purple") + geom_smooth()El color = "purple" de geom_point() está fuera de aes(): fija el color de los puntos y “pisa” el mapping global color = Species, pero sólo para los puntos; las curvas siguen coloreadas por especie.
<-) y luego añadirle capas con +p no se dibuja al crearlo; se dibuja cuando lo “imprimimos” (al escribir p o print(p))¡SÍ! Pero aún falta un poco, hemos de ver más cosas (y sí, usando iris).
Si no puedes esperarte, mira la R Graph Gallery (cientos de gráficos con su código) o la galería de extensiones de ggplot2
the aesthetic parameters de cada geom_xx()
Cuando empecemos a hacer otros tipos de gráficos será de utilidad conocer qué parámetros admite cada geom_xx().
Puedes verlos en la ayuda de cada geom (por ejemplo ?geom_point, sección Aesthetics), en la web de ggplot2 o en la viñeta vignette("ggplot2-specs")
Desde R 4.5, el paquete datasets incluye penguins: datos de 344 pingüinos de 3 especies del archipiélago Palmer (Antártida)
Tarea: haz un gráfico de puntos con la longitud de la aleta (flipper_len) en el eje X, el peso (body_mass) en el eje Y y el color según la especie (species). Añade una recta de regresión para cada especie con geom_smooth(method = "lm").
El libro de Hadley Wickham, Danielle Navarro y Thomas Lin Pedersen: ggplot2: Elegant Graphics for Data Analysis (3ª ed.), gratis online
El capítulo de visualización de R for Data Science (2ª ed.)
La documentación de ggplot2: todas las funciones, con ejemplos
En las siguientes slides veremos más elementos de un ggplot: títulos, themes, facetting, anotaciones, escalas, …