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.

coches <- ggplot(cars, aes(speed, dist)) +
                  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).

fig1 <- ggplot(mpg, aes(displ, hwy, colour = class)) + 
  geom_point()
fig1

Realizamos ahora un gráfico de barras.

fig2 <- ggplot(mpg, aes(x=manufacturer)) +
  geom_bar(stat = "count")
fig2

Introducimos algunos cambios en el formato.

fig3 <- fig2 + geom_bar(fill="steelblue") + theme_minimal()
fig3

Convertimos las columnas en horizontales

fig4 <- fig3 + coord_flip()
fig4

Es posible agrupar diversas figuras en una sola con la función ggarrange del paquet ggpubr.

library(ggpubr)
fig_tot <- ggarrange(fig1, fig2, fig3, fig4,
                     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)
fig1_interactiva <- ggplotly(fig1)
fig1_interactiva

Veamos otro ejemplo.

fig3_int <- ggplotly(fig3)
fig3_int

Ahora crearemos un gráfico de líneas desde cero.

bitcoin <- read.table("bitcoin.txt", header = TRUE, sep = " ") # Importamos el dataset
bitcoin$date <- as.Date(bitcoin$date) # Cambiamos el formato del campo fecha
fig5 <- ggplot(bitcoin, aes(x=date, y=value)) + # Creamos el gráfico
        geom_line() +
        xlab("Evolución del precio del bitcoin") +
        ylab("Dólares") +
        theme_minimal()
fig5_int <- ggplotly(fig5) # Hacemos el gráfico interactivo
fig5_int # Visualizamos el gráfico

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
temperatura <- ggplot(airquality, aes(Day, Temp, group = Month, color = factor(Month))) +
  geom_line() +
  labs(x = "Día del mes", y = "Temperatura")

temperatura + transition_reveal(Day) # Animamos el gráfico

# 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
nombres <- babynames %>% 
  filter(name %in% c("Ashley", "Patricia", "Helen")) %>%
  filter(sex=="F")

# Los representamos en un gráfico de lineas
fig_nombres <- ggplot(nombres, aes(x=year, y=n, group=name, color=name)) +
  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"
fig_nombres + transition_reveal(year) # Animamos el gráfico

# 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
figura10 <- ggplot(gapminder, aes(gdpPercap, lifeExp, size = pop, colour = country)) +
  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')

figura10 # Visualizamos el gráfico

# 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”:

mtcars$cyl <- as.factor(mtcars$cyl)

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.

  1. Gráfico de barras indicando cuántos coches tienen 4, 6 u 8 cilindros.

  1. Diagrama de caja (boxplot) comparando el consumo de gasolina (mpg = miles per gallon) en función del número de cilindros.

  1. 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).

  1. 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.