Capitulo 6 ggplot2

Es indiscutible que hoy en día, las representaciones gráficas en R pasan por el package ggplot2.

Un gráfico realizado con ggplot2 presenta, al menos, tres elementos:

  • Datos (Data) que queremos representar (que serán un data frame).
  • Características estéticas (aesthetic mappings) que describen cómo queremos que los datos se vean en el gráfico. Para más información podemos consultar la vignette (vignette(“ggplot2-specs”)). Como luego veremos, se introducen con la función aes() y se refieren a:
    • posición (en los ejes)
    • color exterior (color)
    • color de relleno (fill)
    • forma de puntos (shape)
    • tipo de línea (linetype)
    • tamaño (size)
  • Objetos geométricos (Geom) representan lo que vemos en un gráficos (puntos, líneas, etc.). Todo gráfico tiene, como mínimo, una geometría. La geometría determina el tipo de gráfico:
    • geom_point (para puntos)
    • geom_lines (para lineas)
    • geom_histogram (para histograma)
    • geom_boxplot (para boxplot)
    • geom_bar (para barras)
    • geom_smooth (líneas suavizadas)
    • geom_polygons (para polígonos en un mapa)
    • etc. (si ejecutáis el comando help.search("geom_", package = "ggplot2") podéis ver el listado de objetos geométricos)

Por tanto, para construir un gráfico con ggplot2 comenzamos con la siguiente estructura de código, usando + como nexo entre argumentos:

ggplot(datos, aes() ) + geom_tipo()

A partir de esta estructura básica puede mejorarse la presentación de los gráficos introduciendo, por ejemplo, características estéticas en los objetos geométricos, rotulando los gráficos, etc.

Otros elementos que conviene tener presente en un gráfico de ggplot2 son:

  • Stat (Stat), transformaciones estadísticas para, generalmente, resumir datos (por ejemplo: contar frecuencias, número de intervalos en los histogramas, etc.).
  • Escalas (Scale). Las escalas, por ejemplo, convierten datos en características estéticas (colores, etc.), crean leyendas… .
  • Coordenadas (coord): sistema de coordenadas cartesianas, polares, proyecciones, etc.
  • Faceting (Faceting), permite representar gráficos separados para subconjuntos de los datos originales.

Vamos a realizar algunos gráficos con ggplot2. Para ello, cargamos la librería. Si no está instalado el paquete lo instalamos.

if(!require(ggplot2)) {
    install.packages("ggplot2")
    library(ggplot2)} 

En los ejemplos que siguen tratamos de ir introduciendo poco a poco distintos elementos y argumentos para mejorar la apariencia de los gráficos.

6.1 geom_point o gráficos de dispersion (scatter plots)

Veamos cómo ha evolucionado la esperanza de vida en Europa

aa <- filter(gapminder, continent == "Europe") 
p = ggplot(data = aa, aes(y = lifeExp, x = year )) +
  geom_point()
p

o, podemos transformar el eje Y para ver la evolución frente a la media

pp = ggplot(aa, aes(y = lifeExp - mean(lifeExp), x = year )) +
  geom_point()
pp

Añadimos color

p = ggplot(aa, aes(y = lifeExp, x = year ,color=gdpPercap)) +
  geom_point()
p

6.1.1 Suavizados (geom_smooth())

El geom_smooth() añade una aproximación de los datos “x” e “y”, e incluye una cinta con el margen de confianza.

p +  geom_smooth() 
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

6.1.2 Texto (geom_text())

Podemos añadir unas etiquetas a los puntos del gráfico de dispersión con el objeto geom_text().

p +  geom_smooth() + 
  geom_text(aes(label=country))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

6.1.3 Aesteticos vs. asignacion

Dentro de aes() debemos poner las variables aestéticas, mientras que valores fijos para todas las variables las podemos poner fuera.

p +
  geom_point(aes(size = 2),# incorrecto! 2 no es una variable
             color="red") # correcto, todos los puntos en rojo

La manera correcta sería esta:

p +
  geom_point(size = 2,# correcto, todos los puntos de tamaño 2
             color="red") # correcto, todos los puntos en rojo

6.1.4 Incluir varios aesteticos

Se pueden mapear otros aestéticos, como “x” e “y”, para visualizar algunas cosas concretas.

p +
  geom_point(aes(size=pop))

6.1.5 Ejercicio

Usa la base de datos data("mtcars")

Hay que crear un gráfico con los siguientes parámetros:

  • Crear un gráfico de dispersión con el mpg en el eje X y el wt en el eje Y.
  • Colorea los puntos en azul.
  • Mapea el color de los puntos a la variable cyl.
  • Haz los puntos más grandes poniendo un tamaño de 2.
  • Mapera el tamaño de los puntos en base a disp.
  • Incluye un suavizado de los datos.

6.2 geom_line() graficos de lineas

Para hacer un gráfico de líneas usaremos una sintaxis muy parecida, pero tendremos que tener en cuenta que R va hacer una línea de punto a punto

bb <- gapminder %>% filter(country == "Spain")
p = ggplot(data = bb, aes(y = lifeExp, x = year )) +
  geom_line()
p

¿Qué ocurriría si tenemos varios países para cada año?

cc <- gapminder %>% filter(continent == "Oceania")
ggplot(data = cc, aes(y = lifeExp, x = year )) +
  geom_line()

Mmmmmmm, ¿qué ha pasado?

ggplot2() ha juntado todos los valores del año. ¿Cómo podemos arreglar esto?

Démosle un color para que nos separe por países por ejemplo:

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

O también podemos separarlo en diferentes figuras:

ggplot(data = cc, aes(y = lifeExp, x = year )) +
  geom_line() + facet_wrap(~country)

6.2.1 Ejercicio

Usa la base de datos gapminder para:

  • Crear un gráfico de la evolución de la esperanza media y máxima de vida en el mundo.
  • Colorea las líneas de color diferente.
  • Crear un gráfico de la evolución de la esperanza media por continente.

6.3 geom_boxplot() Diagramas de caja

Para realizar un diagrama de caja utilizamos la geometría:

ggplot(data = gapminder, aes(y = lifeExp, x = country )) +
  geom_boxplot() 

Podemos colorear las cajas del gráfico incluyendo en las características estéticas la variable que utilizaremos para el relleno. Automáticamente se crea una leyenda para facilitar la lectura del gráfico, que podemos cambiar de posición o eliminar si se considera que no aporta información relevante.

# Diagrama de caja con color de relleno
ggplot(gapminder, aes(y=lifeExp, x=country, fill=continent)) +
  geom_boxplot() +
  labs(x="País", y="Esperanza de vida", fill="Continente")   # título, ejes y leyenda

Podemos añadir estadísticas que nos puedan interesar

ggplot(gapminder, aes(y=lifeExp, x=continent, fill=continent)) +
  geom_boxplot() +
  labs(x="Continente", y="Esperanza de vida", fill="Continente") +  
geom_point(stat= "summary", fun.y=mean, shape=16, size=4, color="red")
## Warning: Ignoring unknown parameters: fun.y
## No summary function supplied, defaulting to `mean_se()`

Y entre otras muchas cosas, podemos cambiar los ejes

ggplot(gapminder, aes(y=lifeExp, x=continent, fill=continent)) +
  geom_boxplot() +
  labs(x="Continente", y="Esperanza de vida", fill="Continente") +  
geom_point(stat= "summary", fun.y=mean, shape=16, size=4, color="red") +
  coord_flip()
## Warning: Ignoring unknown parameters: fun.y
## No summary function supplied, defaulting to `mean_se()`

6.3.1 Ejercicio

Usa la base de datos mpg para:

  • Crear un gráfico de cajas para ver como cambia hwy frente a class.
  • Colorea por tipo drv.
  • Inlcuye un punto para mostrar dónde está la media de hmy en cada gráfico de cajas.

6.4 geom_hist() histograma

Queremos ver cómo se distribuye la esperanza de vida de los países en 2007.

g = gapminder %>% filter(year==2007)
ggplot(g) + geom_histogram(aes(x=lifeExp))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(g) + geom_histogram(aes(x=lifeExp),bins = 20)

ggplot(g) + geom_histogram(aes(x=lifeExp),binwidth =  10)

El argumento bins = ... hace referencia al número de intervalos, mientras que binwidth = ... a la amplitud de estos intervalos.

Por defecto un histograma nos cuenta el número de casos que hay en cada intervalo. Pero hay veces que nos merece la pena ver esto en términos de probabilidad, o mejor dicho, densidad. Para ello:

ggplot(g) + geom_histogram(aes(x=lifeExp,y=..density..))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

cambiamos colores con color = y fill =

ggplot(g) + geom_histogram(aes(x=lifeExp),color="red")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(g) + geom_histogram(aes(x=lifeExp),fill="red")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(g) + geom_histogram(aes(x=lifeExp),color="red",fill="orange")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

6.5 geom_bar() diagrama de barras

El diagrama de barras, como ya sabemos, puede utilizarse para representar variables categóricas (atributos u ordinales) y variables cuantitativas discretas.

n_country = gapminder %>% 
  select(country,continent) %>%
  group_by(continent) %>% 
  filter(!duplicated(country)) %>% 
  ungroup()
ggplot(n_country) + geom_bar(aes(x=continent))

ggplot(n_country) + geom_bar(aes(y=continent))

o usando la base de datos mpg

# número de coches en cada clase
g <- ggplot(mpg, aes(class)) + geom_bar()

Si queremos ver diferentes propiedades dentro de cada clase:

g + geom_bar(aes(fill = manufacturer))

6.6 Mucho mas

Mirad el cheat-sheet de ( https://rstudio.com/wp-content/uploads/2015/03/ggplot2-cheatsheet.pdf) o busquemos en google otros tipos de plot que puedan interesarnos.

6.7 Faceting

Con esta funcionalidad podemos crear graficos diferentes para subsets de datos. Esto facilita la comparación de los datos.

ggplot2 ofrece dos funciones para crear gráficos multiples:

  • facet_wrap(): define el subset como niveles de una sola variable agrupada.
  • facet_grid(): define el subset como el cruce de dos variables agrupadas.
p = ggplot(data = mtcars, aes(y = mpg, x = wt,color= as.factor(cyl) )) +
  geom_point(size=4)
p

6.7.1 facet_wrap

facet_wrap nos permite separar las figuras por variables de la siguiente forma:

p + facet_wrap(~gear)

6.7.2 facet_grid

También está facet_grid() para dos dimensiones. Tiene cierta dificultad de visualización porque las variables categóricas tienen muchos niveles. Con un filtrado previo se facilitaría esta visualización.

p + facet_grid(cols = vars(am), rows = vars(gear))

6.8 Temas

El sistema ggplot2 theme maneja los elementos del gráfico que no están ligados a los datos como:

Los temas incluidos son:

  • theme_gray() (por defecto)
  • theme_bw()
  • theme_classc()

6.8.1 Ejercicio

6.10 Ejercicio

Vamos a pensar en qué queremos visualizar dentro de las bases de datos Siniestros y Historico_siniestros.