--- 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 ```