---
title: "Capítulo 3"
subtitle: Gramática de gráficos
output:
ioslides_presentation: default
beamer_presentation: default
slidy_presentation: default
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE)
```
## Librerías a utilizar:
```{r, echo=TRUE, message=FALSE, results='hide'}
library(tidyverse)
library(datos)
library(patchwork) #sugerencia
```
```{r, echo=TRUE}
str(millas)
```
## Gramática de gráficos
La gramática de gráficos (Wilkinson, 2005) es una
deconstrucción en primeros principios de las gráficas. Nos brinda una serie de reglas y atributos (gramática) que nos permite ir mas allá de las gráficas comunes (palabras) a gráficas complejas (frases).
![](grammar_of_graphics.jpg){ width=60% }
Se utiliza en varias librerias:
- ggplot2
- Tableau
- Vega-Lite
- Plotly
- Altair
## Ejemplo:
A partir de gráficas sencillas (scatterplot) podemos construir gráficas complejas agregando capas.
```{r}
p1 <- ggplot(millas, aes(cilindrada, autopista)) +
geom_point()
p2 <- ggplot(millas, aes(cilindrada, autopista, color = factor(cilindros))) +
geom_point() +
geom_smooth(method = 'lm') +
theme(legend.position = "none")
p1 + p2 #libreria patchwork.
```
## ¿Cómo funciona?
La implementación de la gramática en ggplot2 se hace mediante capas.
```{r, echo=TRUE, eval=FALSE}
ggplot() +
layer(
data = millas,
mapping = aes(cilindrada, autopista),
geom = "point",
stat = "identity",
position = "identity"
)
```
El arquetipo que vamos a usar:
```{r, echo=T, eval=F}
ggplot(data= ) +
(mapping = aes())
```
## Componentes:
* **data:**
+ Los datos a usar. Precisan estar en formato _tidy_.
* **mapping:**
+ Un conjunto de asignaciones estéticas. Especficiadas mediante el comando **aes()**. Describen cómo las variables se transforman en propiedades visuales que percibimos en las gráficas. Por ejemplo, las variables asignadas en los ejes, los colores, el tamaño, la forma, etc.
* **geom:**
+ Los objetos geométricos (**geom_**) renderizan la capa, controlando que tipo de gráfica resulta.
* **stat:**
+ Son transformaciones de los datos, generalmente creadas por las funciones **geom_**. En algunos casos se computan manualmente (ej: **stat_ecdf()**).
* **position:**
+ Ajusta la posición de los elementos en la capa. En el caso de solapamiento se puede definir la lógica para resolver el conflicto mediante el uso de este ajuste. (ej. **position_jitter()** para puntos, **position_dodge()** para histogramas.)
## Geometrias comunes:
* Primitivas graficas comunes:
+ **geom_blank():** No muestra nada.
+ **geom_point():** Puntos.
+ **geom_path():** Caminos.
+ **geom_line():** Caminos ordenados en x.
+ **geom_polygon():** Polígonos rellenos.
+ **geom_abline()** y **geom_hline()** Lineas verticales y horizontales.
+ **geom_text():** Texto.
* En una variable:
- Discreta:
+ **geom_bar():** Distribución.
- Continua:
+ **geom_histogram():** Histograma.
+ **geom_density():** Estimación de densidad.
* Dos variables:
- Ambas continuas:
+ **geom_smooth():** Ajuste continuo.
- Distribucion:
+ **geom_bin2d()** y **geom_hex():** Discretiza y cuenta.
+ **geom_density2d():** Densidad en 2d.
- Al menos una discreta:
+ **geom_jitter():** Agrega ruido a puntos.
- Una continua y una discreta:
+ **geom_boxplot():** Boxplots.
+ **geom_violin():** Violin plot.
* Incertidumbre:
+ **geom_errorbar()** Barras de errores.
* Muchas mas.
## Ejemplos
Se asigna a la estética *color* la variable _clase_ del dataframe. Ggplot2 mediante **scales** mapea la variable discreta _clase_ a puntos equiespaciados en un plano de color (ej. HCL).
```{r, echo=T, fig.height=3.5}
ggplot(data=millas)+
geom_point(mapping=aes(x=cilindrada, y=autopista, color=clase))
```
## Ejemplos
Podemos asignarle la transparencia o la forma a la columna clase.
```{r, echo=T, fig.height=3}
p1 <- ggplot(data=millas)+
geom_point(aes(x=cilindrada, y=autopista, alpha=clase))
p2 <- ggplot(data=millas)+
geom_point(aes(x=cilindrada, y=autopista, shape=clase))
p1 + p2
```
## Ejemplos
Se pueden fijar las propiedades estéticas, asignando la variable fuera de **aes()**. Por ejemplo fijamos el color:
```{r, echo=T, fig.height=3.5}
ggplot(data=millas)+
geom_point(mapping=aes(x=cilindrada, y=autopista), color='blue') +
xlim(c(3,4)) +
ylim(c(20,30))
```
```{r}
library(datos)
ggplot(millas, aes(ciudad, modelo)) +
geom_point() +
facet_grid(fabricante ~ ., scales = "free", space = "free") +
theme(strip.text.y = element_text(angle=0))
```
## Ejemplos
¿Qué pasa si fijamos la variable estética dentro de **aes()**?
Para cada entrada en la gráfica (x,y) se crea una variable color y se le asigna la magnitud 'blue'. Luego, ggplot2 mediante **scales** elige un punto en el plano HLC y se lo asigna al string 'blue'. Este punto es el color rojo/naranja observado.
```{r, echo=T, fig.height=3.5}
ggplot(data=millas)+
geom_point(mapping=aes(x=cilindrada, y=autopista, color='blue'))
```
## Ejemplos
Se pueden utilizar expresiones en las variables estéticas.
```{r, echo=T, fig.height=3.5}
ggplot(millas, aes(x=cilindrada, y=autopista)) +
geom_point(aes(color= cilindros > 6))+
scale_color_manual(values=c('grey70','red'))
```
## Ejemplos
Se puede asignar colores a una variable continua. En este caso ggplot2 traza una curva en el espacio de colores HLC para los valores de la variable.
```{r, echo=T, fig.height=3.5}
ggplot(millas, aes(x=cilindrada, y=autopista)) +
geom_point(aes(color=cilindros))
```
## Ejemplos
Podemos incluso asignar la misma variable a múltiples estéticas.
```{r, echo=T, fig.height=3.5}
ggplot(millas, aes(x=cilindrada, y=autopista)) +
geom_point(aes(color=factor(cilindros),
shape=factor(cilindros),
alpha=factor(cilindros)))
```
## Facetas
Es un mecanismo para mostrar múltiples gráficos en una misma pagina. Divide los datos en subconjuntos y grafica éstos en cada panel.
Hay dos modalidades: **facet_wrap()** y **facet_grid()**.
Para **facet_wrap()** el primer argumento debe ser una variable categórica. Se especifica mediante ~ . El parámetro **scales** fija o libera los ejes para que sean compartidos o no.
```{r, echo=T, fig.height=4}
ggplot(millas, aes(x=cilindrada, y=autopista)) +
geom_point() +
geom_smooth(method='lm', se=F) +
facet_wrap(~clase, nrow=2, scales="free")
```
## Facetas
**facet_grid()** separa los datos en combinaciones de a dos variables especificadas por a ~ b. Si se quiere suprimir una de las variables, se sustituye por un punto ., por ejemplo: (. ~ cilindros).
```{r, echo=T, fig.height=3.5}
ggplot(millas, aes(x=cilindrada, y=autopista)) +
geom_point() +
facet_grid(traccion ~ cilindros)
```
## Ejemplo
```{r, echo=T, fig.height=4.5}
ggplot(economics_long, aes(date, value)) +
geom_line() +
facet_wrap(~variable, scales="free_y", ncol=1)
```
## Objetos geometricos
Comparemos los siguientes gráficos.
Tiene geometrías distintas. La representación gráfica de los puntos viene dada por el objecto geométrico que se utiliza.
```{r, echo=T, fig.height=2.5}
p1 <- ggplot(millas, aes(cilindrada, autopista)) +
geom_point()
p2 <- ggplot(millas, aes(cilindrada, autopista)) +
geom_smooth()
p1 + p2
```
## Ejemplo
Como la gramática es representada en capas, para agregar varias simplemente se usa (+).
```{r, echo=T, fig.height=4}
ggplot(millas, aes(cilindrada, autopista)) +
geom_point() +
geom_smooth()
```
## Ejemplo
Podemos incluso superponerlas y generar el gráfico que teníamos al principio. Donde para cada valor de cilindros diferentes se le superpone una curva de regresión lineal.
Las geometrías heredan **color** de la definición global de ggplot.
```{r, echo=T, fig.height=3}
ggplot(millas, aes(cilindrada, autopista, color = factor(cilindros))) +
geom_point() +
geom_smooth(method = 'lm')
```
## Ejemplo
Los parámetros dentro de las geometrías sobreescriben a los parámetros globales. Si se quiere suprimir algún parámetro global se utiliza **NULL**.
Por ejemplo, en la siguiente gráfica se ajusta por regresión local los valores correspondientes a la clase "subcompacto".
```{r, echo=T, fig.height=2.5}
ggplot(millas, aes(cilindrada, autopista)) +
geom_point(aes(color=clase == "subcompacto")) +
scale_color_manual(values=c('grey70','blue')) +
geom_smooth(data=filter(millas, clase=="subcompacto"), se=FALSE) +
theme(legend.position = "none")
```
## Transformaciones estadísticas
Algunas geometrías implementan transformaciones estadísticas de los datos para generar gráficas. Como por ejemplo los gráficos de barras. En este ejemplo la variable **count** no esta definida en los datos, la genera la geometría.
Otros ejemplos son las geometrias **geom_smooth()** que calcula parámetros de regresión local o lineal, o **geom_boxplot()** que calcula un resumen estadístico de las variables.
```{r, echo=T, fig.height=3}
ggplot(diamantes) +
geom_bar(aes(x = corte))
```
##
La relación entre estadísticas y geometrías es reciproca. Cada estadística tiene una geometría predeterminada.
Por ejemplo:
```{r, echo=T, fig.height=2.5}
ggplot(diamantes) +
stat_count(aes(x = corte))
```
##
Comúnmente se utilizan las funciones de geometría. Sin embargo hay algunas razones para especificar las funciones estadísticas.
* Anular la estadística predeterminada por una customizada.
* Cambiar el mapeo de las variables estéticas, por ejemplo en vez de conteo usar proporción.
* Si se quiere reslatar una transformación estadistíca en particular.
* Si la estadística que se quiere no tiene una función geométrica asociada.
```{r, echo=T, fig.height=1.9}
ggplot(diamantes) +
stat_summary(
mapping = aes(corte, profundidad),
fun.min = min,
fun.max = max,
fun = median
)
```
## Ajustes de posición
Podemos colorear los graficos de barras utilizando la estética **color** y **fill**.
```{r, echo=T, fig.height=2.5}
p1 <- ggplot(diamantes, aes(x = corte)) +
geom_bar(aes(color=corte)) +
theme(legend.position = "none",
axis.text.x = element_text(angle = -30, vjust= 1, hjust = 0))
p2 <- ggplot(diamantes, aes(x = corte)) +
geom_bar(aes(fill=corte)) +
theme(legend.position = "none",
axis.text.x = element_text(angle = -30, vjust= 1, hjust = 0))
p1 + p2
```
##
Sin embargo si se utiliza otra variable para rellenar, las barras se apilan automáticamente. Donde cada rectángulo corresponde a una combinación de _corte_ y _claridad_.
```{r, echo=T, fig.height=4}
ggplot(data=diamantes) +
geom_bar(mapping = aes(x=corte, fill=claridad))
```
##
La variable **position** nos da alternativas al gráfico anterior. Hay tres modalidades:
* **position_stack():** Apila las barras.
* **position_fill():** Apila las barras pero el tope siempre esta en 1.
* **position_dodge():** Coloca las barras lado a lado.
```{r, echo=T, fig.height=2}
dplot <- ggplot(data=diamantes, aes(x=corte, fill=claridad)) +
theme(legend.position = "none",
axis.text.x = element_text(angle = -30, vjust= 1, hjust = 0))
p1 <- dplot + geom_bar()
p2 <- dplot + geom_bar(position="fill")
p3 <- dplot + geom_bar(position="dodge")
p1 + p2 + p3
```
## Ejemplo
Cuando se trabaja con gráficos de puntos **geom_point()** hay tres modalides de posición.
* **position_nudge():** Mueve los puntos por un offset especificado.
* **position_jitter():** Agregua un ruido aleatorio a cada posición.
* **position_jitterdodge():** Esquiva puntos dentro de grupos y luego agrega ruido.
```{r, echo=T, fig.height=1.5}
p1 <- ggplot(millas, aes(cilindrada, autopista, alpha=0.5))+
geom_point() +
theme(legend.position = "none")
p2 <- ggplot(millas, aes(cilindrada, autopista, alpha=0.5)) +
geom_point(position=position_jitter(width=0.5, height=0.5)) +
theme(legend.position = "none")
p1 + p2
```