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.
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
Añadimos color
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.
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()
.
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:
6.1.4 Incluir varios aesteticos
Se pueden mapear otros aestéticos, como “x” e “y”, para visualizar algunas cosas concretas.
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:
O también podemos separarlo en diferentes figuras:
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:
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.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
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:
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
cambiamos colores con color =
y fill =
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `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))
o usando la base de datos mpg
Si queremos ver diferentes propiedades dentro de cada clase:
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.
6.7.1 facet_wrap
facet_wrap
nos permite separar las figuras por variables de la siguiente forma:
6.8 Temas
El sistema ggplot2 theme maneja los elementos del gráfico que no están ligados a los datos como:
- Etiquetas de los ejes.
- El fondo del gráfico.
- La etiqueta del fondo.
- Apariencia de la leyenda.
- Aquí tenemos todo o casi todo https://ggplot2.tidyverse.org/reference/theme.html
Los temas incluidos son:
theme_gray()
(por defecto)theme_bw()
theme_classc()
6.8.1 Ejercicio
- Probemos los diferentes temas añadiendo por ejemplo
+ theme_bw()
- Pensemos a ver qué temas queremos modificar en el gráfico, y usemos la ayuda de R, esta referecnia https://ggplot2.tidyverse.org/reference/theme.html, el cheat sheet o googgle-san
6.9 La pregunta mas popular
La pregunta que se hace más frecuentemente es algo así: tengo dos variables en mi dataset y quiero hacer un gráfico con ellas en puntos separados, con diferente color dependiendo de la variable. ¿Cómo lo puedo hacer?
ERRONEO es usar el formato “wide”
ggplot(mtcars,
aes(x=wt)) +
geom_point(aes(y=mpg), color="red") +
geom_point(aes(y=qsec), color="blue")
CORRECTA es usar el formato “long”
ea = gather(mtcars,value = "Medida",key = "Tipo",mpg,qsec)
ggplot(ea, aes(x=wt,y=Medida,color=Tipo)) + geom_point()
Y si usamos todo el potencial de tidyverse a la vez…
gather(mtcars,value = "Medida",key = "Tipo",mpg,qsec) %>% ggplot( aes(x=wt,y=Medida,color=Tipo)) + geom_point()
Volvemos a usar la función gather()
busquemos ayuda o recordemos como funciona. Lo tenemos en la sección de procesamiento de datos con tidyr.
6.10 Ejercicio
Vamos a pensar en qué queremos visualizar dentro de las bases de datos Siniestros y Historico_siniestros.