Capítulo 10 Creación de gráficos
10.1 Gráficos de base en R
R incorpora algunas funciones para crear gráficos como, por ejemplo, plot
.
data(cars)
plot(cars)
La primera variable aparece representada en el eje horizontal (x) y la segunda en el vertical (y), pero, si lo deseamos, lo podemos modificar.
plot(cars$dist, cars$speed)
Es posible hacer gráficos de puntos (p), líneas (l) o combinar ambos (b). También podemos añadir color.
plot(cars, type = "p", col = "red")
Veamos ahora como etiquetar los ejes. El argumento “pch” permite modificar el tipo de marcador.
plot(cars, type = "p", col = "steelblue",
main = "Relación entre velocidad y distancia de frenado",
xlab = "Velocidad (km/h)",
ylab = "Distancia (metros)",
pch = 19)
Veamos ahora otros tipos de gráficos.
boxplot(cars, main = "boxplot") # Diagrama de caja
hist(cars$speed) # Histograma
pie(cars$dist) # Gráfico de "tarta"
10.2 Gráficos con ggplot2
El paquete para gráficos ggplot2
se puede instalar por separado o conjuntamente con otros dentro de tidyverse
.
library(tidyverse)
Los gráficos ggplot
tienen tres argumentos:
data: un data.frame
aesthetics (aes): variables (x, y), color, tamaño, forma, etc.
geometry (geom): tipo de gráfico (dispersión, barras, lineas, etc.)
Creamos un gráfico de dispersión al que denominamos «coches» y lo visualizamos.
<- ggplot(cars, aes(speed, dist)) +
coches geom_point() +
ggtitle("Gráfico de dispersión")
coches
Trabajaremos ahora con otro dataset también disponible en R.
data(mpg) # Cargamos los datos
str(mpg) # Observamos la estructura del dataset
## tibble [234 x 11] (S3: tbl_df/tbl/data.frame)
## $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
## $ model : chr [1:234] "a4" "a4" "a4" "a4" ...
## $ displ : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ year : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cyl : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
## $ trans : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ drv : chr [1:234] "f" "f" "f" "f" ...
## $ cty : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
## $ hwy : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
## $ fl : chr [1:234] "p" "p" "p" "p" ...
## $ class : chr [1:234] "compact" "compact" "compact" "compact" ...
Creamos un gráfico de dispersión con tres variables. Representamos las dos primeras en los dos ejes y la tercera mediante el color (colour) o la forma (shape).
<- ggplot(mpg, aes(displ, hwy, colour = class)) +
fig1 geom_point()
fig1
Realizamos ahora un gráfico de barras.
<- ggplot(mpg, aes(x=manufacturer)) +
fig2 geom_bar(stat = "count")
fig2
Introducimos algunos cambios en el formato.
<- fig2 + geom_bar(fill="steelblue") + theme_minimal()
fig3 fig3
Convertimos las columnas en horizontales
<- fig3 + coord_flip()
fig4 fig4
Es posible agrupar diversas figuras en una sola con la función ggarrange
del paquet ggpubr
.
library(ggpubr)
<- ggarrange(fig1, fig2, fig3, fig4,
fig_tot labels = c("A. Título 1",
"B. Título 2",
"C. Título 3",
"D. Título 4"),
nrow = 2, ncol = 2)
fig_tot
10.3 Gráficos interactivos
Para visualizar los ejemplos de gráficos interactivos y animados, es necesario que consultes la versión HTML del documento. Si estás leyendo una versión en formato PDF no podrás verlos.
Para dotar a los gráficos de interactividad, utilizaremos el paquete plotly
.
library(plotly)
<- ggplotly(fig1)
fig1_interactiva fig1_interactiva
Veamos otro ejemplo.
<- ggplotly(fig3)
fig3_int fig3_int
Ahora crearemos un gráfico de líneas desde cero.
<- read.table("bitcoin.txt", header = TRUE, sep = " ") # Importamos el dataset
bitcoin $date <- as.Date(bitcoin$date) # Cambiamos el formato del campo fecha
bitcoin<- ggplot(bitcoin, aes(x=date, y=value)) + # Creamos el gráfico
fig5 geom_line() +
xlab("Evolución del precio del bitcoin") +
ylab("Dólares") +
theme_minimal()
<- ggplotly(fig5) # Hacemos el gráfico interactivo
fig5_int # Visualizamos el gráfico fig5_int
10.4 Gráficos animados
Al igual que los gráficos interactivos, para visualizar los ejemplos que vienen a continuación, es necesario que consultes la versión HTML del documento. Si estás leyendo una versión en formato PDF no podrás verlos.
Utilizaremos el paquete gganimate
y diversos datasets disponibles en R.
library(gganimate) # Llamamos al paquete
data(airquality) # Descargamos los datos
<- ggplot(airquality, aes(Day, Temp, group = Month, color = factor(Month))) +
temperatura geom_line() +
labs(x = "Día del mes", y = "Temperatura")
+ transition_reveal(Day) # Animamos el gráfico temperatura
# Podemos guardar el gráfico animado como gif: anim_save(nombre.gif)
Veamos otro ejemplo
library(babynames)
data(babynames) # Cargamos los datos
# Filtramos las frecuencias relativas a tres nombres
<- babynames %>%
nombres filter(name %in% c("Ashley", "Patricia", "Helen")) %>%
filter(sex=="F")
# Los representamos en un gráfico de lineas
<- ggplot(nombres, aes(x=year, y=n, group=name, color=name)) +
fig_nombres geom_line() +
geom_point() +
ggtitle("Popularidad de tres nombres en Estados Unidos") +
xlab("Año")
ylab("Número de bebés")
## $y
## [1] "Número de bebés"
##
## attr(,"class")
## [1] "labels"
+ transition_reveal(year) # Animamos el gráfico fig_nombres
# Podemos guardar el gráfico animado como gif: anim_save(nombre.gif)
Veamos un último ejemplo en el que utilizaremos el paquete gifski
.
library(gifski)
library(gapminder)
data(gapminder)
# Hacemos un grafico con ggplot2
<- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
figura10 geom_point(alpha = 0.7, show.legend = FALSE) +
scale_colour_manual(values = country_colors) +
scale_size(range = c(2, 12)) +
scale_x_log10() +
# Esta parte es la de la animacion:
labs(title = 'Year: {frame_time}', x = 'GDP per capita', y = 'Esperanza de vida') +
transition_time(year) +
ease_aes('linear')
# Visualizamos el gráfico figura10
# Podemos guardar el gráfico animado como gif: anim_save(nombre.gif)
10.5 Ejercicio 10. Creación de gráficos
Para hacer este ejercicio, necesitas el dataset mtcars
que está disponible por defecto en R. Para obtenerlo, simplemente debes usar la siguiente función:
data(mtcars)
Antes de comenzar, debes convertir el campo “cilindros” (cyl) a formato “factor”:
$cyl <- as.factor(mtcars$cyl) mtcars
Ahora ya puedes crear el código para replicar los gráficos que encontrarás a continuación con el paquete ggplot2
. Añade los títulos y las etiquetas de los ejes a cada gráfico.
- Gráfico de barras indicando cuántos coches tienen 4, 6 u 8 cilindros.
- Diagrama de caja (boxplot) comparando el consumo de gasolina (mpg = miles per gallon) en función del número de cilindros.
- Gráfico de dispersión indicando, en el eje horizontal, el peso del vehículo (wt = weight) y, en el eje vertical, el consumo de gasolina (mpg = miles per gallon).
- Completar el gráfico anterior indicando con colores el tipo de coche según sus cilindros.
De manera opcional puedes intentar hacer interactivo o animar alguno de los gráficos anteriores u otro gráfico que resulte de tu interés.