class: center, middle, inverse, title-slide # Visualización estática e interactiva con ggplot2 y plotly ### Natalia da Silva
Instituto de Estadística-UDELAR --- ## <span style="color:#88398A"> Sobre mi</span> - Profesora en el Instituto de Estadística de la Universidad de la República en Montevideo (UDELAR-IESTA) - Doctorado y Maestría en Estadística: Iowa State University, USA - Investigación: aprendizaje automático, estadística computacional, visualización estadística y meta-análisis - Chair de LatinR2018, Co-fundadora de R-Ladies Ames y R-Ladies Montevideo --- ## <span style="color:#88398A"> Sobre el taller </span> - Porqué y para qué visualizar - Visualización estadística - Ideas para una visualización efectiva - ¿Porqué usar ggplot2? - Gramática de gráficos - Qué es la visualización interactiva - Como hacer visualización interactiva con plotly --- ## <span style="color:#88398A">Importancia de la visulización</span> "The greatest value of a picture is when it forces us to notice what we never expected to see." <a name=cite-tukey77></a>[Tukey (1977)](#bib-tukey77) --- ## <span style="color:#88398A">Pocos se escapan a este pensamiento</span> - Los cálculos numéricos son exactos pero los gráficos son toscos o aproximados - Para cada tipo de datos estadísticos hay un conjunto de cálculos que constituyen un análisis estadístico correcto - Hacer cálculos intrincados es virtuoso mientras que mirar los datos es hacer trampa, <a name=cite-anscombe></a>[Anscombe F (1973)](#bib-anscombe) --- ## <span style="color:#88398A"> Visualización Estadística</span> La visualización juega un rol importante en todas las etapas del análisis estadístico. - **Exploración:** Encontrar patrones generales y específicos en los datos. - **Modelado:** Chequear supuestos sobre los datos antes de modelar. Se puede hacer inferencia gráfica (nueva linea). - **Diagnóstico:** Visualizar el modelo en el espacio de los datos ó los datos en el espacio del modelo. --- ## <span style="color:#88398A"> ¿Cuál es la relación entre X e Y?</span> <table class="table table-bordered" style="font-size: 15px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> X </th> <th style="text-align:right;"> Y </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 1.972 </td> <td style="text-align:right;"> 1.236 </td> </tr> <tr> <td style="text-align:right;"> 1.112 </td> <td style="text-align:right;"> 1.994 </td> </tr> <tr> <td style="text-align:right;"> 0.000 </td> <td style="text-align:right;"> 1.009 </td> </tr> <tr> <td style="text-align:right;"> 0.665 </td> <td style="text-align:right;"> 1.942 </td> </tr> <tr> <td style="text-align:right;"> 0.235 </td> <td style="text-align:right;"> 0.356 </td> </tr> <tr> <td style="text-align:right;"> 0.247 </td> <td style="text-align:right;"> 1.658 </td> </tr> <tr> <td style="text-align:right;"> 1.275 </td> <td style="text-align:right;"> 1.961 </td> </tr> <tr> <td style="text-align:right;"> 0.702 </td> <td style="text-align:right;"> 0.045 </td> </tr> <tr> <td style="text-align:right;"> 1.760 </td> <td style="text-align:right;"> 0.350 </td> </tr> <tr> <td style="text-align:right;"> 1.691 </td> <td style="text-align:right;"> 0.277 </td> </tr> <tr> <td style="text-align:right;"> 1.628 </td> <td style="text-align:right;"> 1.778 </td> </tr> <tr> <td style="text-align:right;"> 1.957 </td> <td style="text-align:right;"> 1.290 </td> </tr> </tbody> </table> --- ## <span style="color:#88398A"> ¿Porqué usamos visualización?</span> <img src="index_files/figure-html/unnamed-chunk-2-1.png" style="display: block; margin: auto;" /> <img src="gelman.png" width="700" class="center"> <a name=cite-gelman2002let></a>[Gelman, Pasarica, and Dodhia (2002)](#bib-gelman2002let) --- ## <span style = "color:#883984">¿Porqué usamos visualización? </span> .pull-left[ - Los gráficos proveen más información que los resúmenes numéricos - Anscombe’s quartet [Anscombe F (1973)](#bib-anscombe) - `\(n = 11\)` - `\(\bar x= 9.0\)` - `\(\bar y = 7.5\)` - `\(\hat \beta_1= 0.5\)` - `\(y = 3 + 0.5 x\)` - `\(R^2 = 0.667\)` - `\(....\)` ] .pull-right[ <img src = "Quartet.png" width = "400" class = "center"> ] <!-- % \item Sum of squares of x - 110.0 --> <!-- % \item Regression sum of squares = 27.50 (1 d.f.) --> <!-- % \item Residual sum of squares of y = 13.75 (9 d.f.) --> <!-- % \item Estimated standard error of bi = 0.118 --> <!-- % \item Multiple R2 = 0.667 --> --- ## <span style = "color:#883984">¿Porqué usamos visualización? </span> .pull-left[ <img src = "dino.png" width = 400 class = "center"> https://github.com/stephlocke/datasauRus - <a name=cite-matejka2017same></a>[Matejka and Fitzmaurice (2017)](#bib-matejka2017same) ] .pull-right[ - Mismos resúmenes estadísticos - Distribuciones muy diferentes - [Link algoritmo](https://www.autodeskresearch.com/publications/samestats). ] --- ## <span style = "color:#883984">Visualizaciones efectivas</span> - No todas las visualizaciones son igualmente efectivas - Hay diferentes criterios para evaluar gráficos (Cleveland, Tufte, Car, Wainer, etc ) - Basado en el estudio de la percepción gráfica - Las mejores visualizaciones son aquellas que requieren el uso de la visión "pre-attentive" (instantáneo, sin aparente esfuerzo visual) <a name=cite-cleveland></a>[Cleveland William and McGuill (1985)](#bib-cleveland). --- ## <span style = "color:#883984">Cleveland, Percepción gráfica</span> <img src = "cleveland.png" width = 600 class = "center"> --- ## <span style = "color:#883984">¿Cómo decodificamos un gráfico?</span> - Cuando miramos un gráfico la información es visualmente decodificada por el sistema visual de la persona - Un método gráfico es efectivo solamente si la decodificación lo es - Buenas visualizaciones son las que optimizan el sistema visual humano - Si esto es verdad tendríamos que saber cómo el sistema humano decodifica un gráfico <!-- % Tres operaciones visuales de la percepci\'on de patrones por Cleveland: --> <!-- % \begin{itemize} --> <!-- % \item \textbf{Deteci\'on:} reconocimiento visual de un objeto geométrico codificado en un valor f\'isico --> <!-- % \item \textbf{Ensamblado:} es el agrupado de elementos gr\'aficos detectados --> <!-- % \item \textbf{Estimaci\'on:} es la actividad visual de los valores relativos de 2 o mas valores cuantitativos --> <!-- % %(mayor menor distinto ratios etc) --> <!-- % \end{itemize} --> --- ## <span style="color:#88398A"> Comparar variables cuantitativas</span> Cleveland ordena la dificultad de los elementos gráficos basado en la percepción para estimar variables cuantitativas - Posición a lo largo de una escala común - Posición en escalas no alineadas pero idénticas - Longitud - Ángulo o pendiente - Área - Volumen, densidad o saturación del color - Tono del color --- ## <span style="color:#88398A"> ¿Cómo uso esto?</span> - Cuál es la comparación más importante que quiero hacer cuando tengo variables cuantitativas - Tenemos que codificar eso que quiero comparar usando los elementos gráficos en la tabla en orden ( 1. posiciones en la misma escala ) --- ## <span style="color:#88398A">Comparar millas por galón (mpg)</span> <img src = "clplot.png" width = 800> --- ## <span style="color:#88398A">Ángulo ó pendiente</span> - Gráficos de torta son siempre un error!!! - Pero ahora sabemos porqué - Porque decodificar variables cuantitativas usando ángulos es más difícil que con otros elementos gráficos - Siempre es preferible un gráfico de barras a uno de torta --- ## <span style="color:#88398A">Visualización para comunicar...</span> <img src = "ej1.png" width =700> --- ## <span style="color:#88398A"> ¿Porqué usar ggplot2 ?</span> - **ggplot2** es un paquete para producir gráficos estadísticos o de datos desarrollado por <a name=cite-wickham2016ggplot2></a>[Wickham (2016)](#bib-wickham2016ggplot2). - Tiene una teoría que lo sustenta basada en el Grammar of Graphics <a name=cite-wilkinson2006grammar></a>[Wilkinson (2006)](#bib-wilkinson2006grammar). - Es el paquete de gráficos estadísticos más dominante en R, tiene ya 10 años! - [ggplot2: Elegant Graphics for Data Analysis](https://github.com/hadley/ggplot2-book) --- ## <span style="color:#88398A"> Grammar of Graphics </span> La **Gramática de gráficos** nos responde las preguntas: - ¿Qué es un gráfico? - ¿Como describir un gráfico? - ¿Como crear un gráfico? Gráfico: mapeo de los datos a atributos estéticos de objetos geométricos --- ## <span style="color:#88398A">¿Porqué usar una gramática gráfica ? </span> .pull-left[ - Graficar cosas que sabés - Crear nuevas visualizaciones - Tal vez encontrar mejores gráficos para visualizar tus datos ] .pull-right[ El límite es tu imaginación! <img src = "imaginacion.png" width =200> ] --- ## <span style="color:#88398A">`ggplot2` </span> - Conjunto de componentes independientes, le da flexibilidad - No limitado a gráficos pre determinados, crear lo que quieras - Definido en base a un conjunto de principios, fácil de aprender - Podés producir gráficos estandard de calidad publicable en poco tiempo - Diseñado para trabajar iterativamente agregando capas --- ## <span style="color:#88398A">Gramática de gráficos </span> - **data**: con mapeos (aes) entre los datos y los elementos gráficos - **layers**: elementos geométricos (**geoms**, son puntos, lineas, rectángulos, texto, ...) y transformaciones estadísticas (**stats**, son identidades, conteos, bins,...) - **scales**: mapea valores en el espacio de los datos a valores en el espacio estético (ej. color, tamaño, forma o tb posición) - **coord**: normalmente Cartesianas, pero ej pie charts ej; polar - **facetas**: como se arregla el display cuando son muchos gráficos - **theme** items para mejorar el dibujo como fuente, tamaño color, background... --- ## <span style="color:#88398A">Instalar ggplot2</span> - Instalar ggplot2 ```r install.packages("ggplot2") ``` Versión en desarrollo: https://github.com/tidyverse/ggplot2 ```r install.packages("devtools") library(devtools) install_github("tidyverse/ggplot2") ``` --- <!-- tips <- read_csv("http://www.ggobi.org/book/data/tips.csv") --> ## <span style="color:#88398A"> Ejemplo propina </span> ``` ## # A tibble: 6 x 7 ## total propina sexo fuma dia momento cantidad ## <dbl> <dbl> <chr> <chr> <chr> <chr> <int> ## 1 17.0 1.01 F No Do Noche 2 ## 2 10.3 1.66 M No Do Noche 3 ## 3 21.0 3.5 M No Do Noche 3 ## 4 23.7 3.31 M No Do Noche 2 ## 5 24.6 3.61 F No Do Noche 4 ## 6 25.3 4.71 M No Do Noche 4 ``` --- ## <span style="color:#88398A"> Tres componentes de todo plot </span> - **data**: datos - **aes**: un conjunto de mapeos estéticos entre las variables en los datos y las propiedades visuales. - **layer**: al menos una capa que describe como representar cada observación. Las capas son creadas con la función **geom**. --- ## <span style="color:#88398A">Tres componentes de todo plot</span> - **data**: propina - **aes**: total mapeado a la posición x , propina a la posición y. - **layer**: puntos mediante geom_point. ```r ggplot(data = propinas, aes(x = total, y = propina)) + geom_point() + theme(aspect.ratio = 1) ``` <img src="index_files/figure-html/unnamed-chunk-5-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Ejemplo propina</span> ¿Qué vemos? - Hay una relación lineal débil entre propina y la cuenta total - Hay mucha variabilidad - Las lineas horizontales indican la preferencia de la gente a dar de a 1 dólar de propina c/u --- ## <span style="color:#88398A">Color, tamaño, forma y otros aes</span> Para agregar otras variables al gráfico podemos usar otros **aes** como color, forma o tamaño ```r aes(x = total, y = propina, colour = sexo) aes(x = total, y = propina, shape = sexo) aes(x = total, y = propina, size = cantidad) ``` --- ## <span style="color:#88398A">Color </span> ```r ggplot(data = propinas, aes(x = total, y = propina, colour = sexo)) + geom_point() + theme(aspect.ratio = 1) ``` <img src="index_files/figure-html/unnamed-chunk-6-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Color fijo </span> Si queremos fijar un elemento estético a un valor fijo hay que hacerlo en la capa de afuera sin aes o usar `I('blue')` en aes ```r ggplot(data = propinas, aes(x = total, y = propina) )+ geom_point(colour = "blue") + theme(aspect.ratio = 1) ``` <img src="index_files/figure-html/unnamed-chunk-7-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Forma </span> ```r ggplot(data = propinas, aes(x = total, y = propina, shape = sexo)) + geom_point() + theme(aspect.ratio = 1) ``` <img src="index_files/figure-html/unnamed-chunk-8-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Tamaño</span> ```r ggplot(data = propinas, aes(x = total, y = propina, size = cantidad)) + geom_point(alpha = 1 / 3) + theme(aspect.ratio = 1) ``` <img src="index_files/figure-html/unnamed-chunk-9-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Tamaño</span> ```r ggplot(data = propinas, aes(x = total, y = propina) ) + geom_point(size = 5, alpha = 1 / 3) + theme(aspect.ratio = 1) ``` <img src="index_files/figure-html/unnamed-chunk-10-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">scales </span> - Los datos hay que convertirlos desde unidades datos (moneda, sexo, etc) a unidades gráficas (color,forma, etc) que se pueden representar en la computadora - La conversión es llamada escalado y es realizada por `scales` - `color` son representados por una cadena de seis letras y números, `sizes` por números y `shape` por enteros - Estas especificaciones estéticas que tienen sentido para R se describen en ` vignette("ggplot2-specs")` --- ## <span style="color:#88398A">scales </span> - Mapeo estético solamente dice que una variable debe ser mapeada a un elemento estético pero no dice cómo debe ser. - Cuando mapeo una variable a `shape` usando `aes(shape = x)` no especifico la forma (`shape`) específica que debe tomar. - Cuando uso `aes(color = z)` no digo de que color debe ser - Describir el color, la forma, el tamaño etc (color, shape, size) a usar se hace mediante transformaciones en `scale` --- ## <span style="color:#88398A">scales</span> - `color` y `fill` - `size` - `shape` - `linetype` Las `scales` se modifican con una serie de funciones con el siguiente esquema de nombrado `scale_<aesthetic>_<type>`. Mirar `scale_<tab>` ver la lista de las funciones de `scale`. --- ## <span style="color:#88398A">`scales` disponibles</span> <img src="summary.png" width="700"> --- ## <span style="color:#88398A"> Gramática de gráficos </span> ```r ggplot(propinas, aes(total, propina, colour = fuma)) + geom_point() ``` <img src="index_files/figure-html/unnamed-chunk-11-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">¿Qué hay atrás de este plot?</span> - Cada observación representada como un punto cuya posición está de acuerdo a dos variables (posición horizontal y vertical) - Cada punto tiene tamaño, color y forma estos atributos son llamados elementos estéticos (inglés aesthetics `aes` ) - Los `aes` son propiedades que pueden ser percibidas en el gráfico cada `aes` puede ser mapeado a una variable o fijado en un valor constante - `total` es mapeado a la posición horizontal, `propina` a la posición vertical y `fuma` al color. Tamaño y forma no son mapeados a variables (valor por defecto) --- ## <span style="color:#88398A">¿Qué hay atrás de este plot?</span> ``` ## # A tibble: 3 x 3 ## total propina fuma ## <dbl> <dbl> <chr> ## 1 17.0 1.01 No ## 2 10.3 1.66 No ## 3 21.0 3.5 No ``` - Nuevos datos, mapeo de los elementos estéticos a los datos originales |x | y | colour| |---|---|-------| |17.0| 1.01| No| |10.3| 1.66| No| |21.0| 3.5| No| --- ## <span style="color:#88398A">Capas de un gráfico</span> - Los datos, mapeos estéticos, objetos geométricos y las transformaciones estadísticas forman una **capa** - Podemos tener un gráfico con muchas capas --- ## <span style="color:#88398A">Capas de un gráfico</span> La gramática de capas define componentes de un gráfico: - datos y conjunto de mapeos de variables a elementos estéticos - una o más capas, cada capa tiene un elemento geométrico, una transformación estadística, una posición y opcional datos y aes --- ## <span style="color:#88398A">Capas de un gráfico</span> ```r ggplot() + layer( data = propinas, mapping = aes(x = total, y = propina), geom = "point", stat = "identity", position = "identity" ) + scale_x_continuous() + scale_y_continuous() + coord_cartesian() ``` Equivalente a : ```r ggplot(data = propinas, aes(x = total, y = propina)) + geom_point() + ``` --- ## <span style="color:#88398A">Capas de un gráfico</span> Varios conjuntos de datos: ```r ggplot() + geom_point(data = propinas, aes(x = total, y = propina)) + geom_point(data = data.frame(x = 30, y = 6), aes(x, y), color = "red", size = 10) ``` <img src="index_files/figure-html/unnamed-chunk-15-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Capas de un gráfico</span> Varios conjuntos de datos: ```r p1 <- ggplot() + layer( data = propinas, mapping = aes(x = total, y = propina), geom = "point", stat = "identity", position = "identity" ) + scale_x_continuous() + scale_y_continuous() + coord_cartesian() p1 + layer(data = data.frame(x = 30, y = 6), mapping = aes(x = x, y = y, color = I("red"), size = I(10)), geom = 'point', stat = 'identity', position ='identity' ) + scale_x_continuous() + scale_y_continuous() + coord_cartesian() ``` --- ## <span style="color:#88398A">Paneles </span> - Se pueden desplegar variables categóricas adicionales en un gráfico particionando el panel. - Crea tablas de gráficos partiendo los datos en subconjuntos y mostrándolos el mismo gráfico para cada subconjunto. - Dos tipos: `facet_grid` y `facet_wrap` --- ## <span style="color:#88398A"> `facet_wrap` </span> ```r ggplot(data = propinas, aes(x = total, y = propina)) + geom_point() + theme(aspect.ratio = 1) + facet_wrap( ~sexo) ``` <img src="index_files/figure-html/unnamed-chunk-17-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">`facet_grid`</span> ```r ggplot(data = propinas, aes(x = total, y = propina)) + geom_point() + theme(aspect.ratio = 1) + facet_grid(sexo ~fuma) ``` <img src="index_files/figure-html/unnamed-chunk-18-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Otros geoms</span> Cuando substituimos `geom_pont()` por otro `geom` obtenemos un gráfico distinto. Los `geom` más comunes: - `geom_smooth()` - `geom_boxplot()` - `geom_histogram()` - `geom_bar()` - `geom_path()` y `geom_lines()` cada `geom` tiene asociados elementos estéticos particulares --- ## <span style="color:#88398A">Incluir labs</span> ```r ggplot(data = propinas, aes(x = total, y = propina, color = sexo)) + geom_point() + theme(aspect.ratio = 1) + labs(x = "Total de la cuenta", y = "Propina", color = "Sexo") ``` <img src="index_files/figure-html/unnamed-chunk-19-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Incluir labs </span> ```r ggplot(data = propinas, aes(x = total, y = propina, colour = sexo)) + geom_point() + theme(aspect.ratio = 1) + scale_x_continuous(name ="Total de la cuenta") + scale_y_continuous(name = "Propina") + scale_color_discrete("Sexo") ``` <img src="index_files/figure-html/unnamed-chunk-20-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A"> theme</span> - `theme` en un gráfico permite controlar los elementos que no son datos en el mismo. - Ayuda a hacer tu gráfico estéticamente como lo querés no afecta el mapeo de datos. - `theme` te da control sobre las fuente, el fondo, ticks, etc. --- ## <span style="color:#88398A">Tu turno </span> - Hacer un gráfico de dispersión: componentes estéticos `x` total, `y` propina, `color` fuma - Cambiá el nombre de los ejes: `x = "Total gastado en dólares" `, `y = "Propina en dólares"` - Cambiá el nombre de la leyenda de color a "Fumdador"" - Cambiá la posición de la leyenda en la parte inferior del gráfico usando `theme` - Cambiar la paleta de colores a Dark2 usando `scale_color_brewer` --- ## <span style="color:#88398A">Tu turno: solución </span> ```r ggplot(data = propinas, aes(x = total, y = propina, color = fuma)) + geom_point( )+ scale_color_brewer(palette = "Dark2") + labs(x = "Total gastado en dólares", y = "Propina en dólares", color = "Fumandor") + theme(aspect.ratio = 1, legend.position = "bottom") ``` <img src="index_files/figure-html/unnamed-chunk-21-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Tu turno </span> - Incluir un suavizado lineal usando geom_smooth - Cambiar el color de la linea a negro --- ## <span style="color:#88398A">Tu turno: solución </span> ```r ggplot(data = propinas) + geom_point( aes(x = total, y = propina, color = fuma) )+ scale_color_brewer(palette = "Dark2") + labs(x = "Total gastado en dólares", y = "Propina en dólares", color = "Fumador") + theme(aspect.ratio = 1, legend.position = "bottom") + geom_smooth(aes(x = total, y = propina), method = "lm", color ="black") ``` <img src="index_files/figure-html/unnamed-chunk-22-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Tu turno: solución </span> ```r propina.lm <- lm(propina ~ total, data = propinas) coef <- propina.lm$coefficients ggplot(data = propinas) + geom_point( aes(x = total, y = propina, color = fuma) ) + scale_color_brewer(palette = "Dark2") + labs(x = "Total gastado en dólares", y = "Propina en dólares", color = "Fumador") + theme(aspect.ratio = 1, legend.position = "bottom")+ geom_abline(intercept = coef[[1]] , slope = coef[[2]] ) ``` <img src="index_files/figure-html/unnamed-chunk-23-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Tu turno </span> - Hacer un gráfico de barras para la variable `dia` usando `geom_bar` - Colorear por día de la semana las barras usar el elemento estético `fill` - Ordena los días según frecuencia (usá `fct_infreq()`) - Rotá el gráfico usando `coord_flip` --- ## <span style="color:#88398A">Tu turno: sol </span> ```r ggplot(data = propinas, aes(x = fct_infreq(dia), fill = dia)) + geom_bar() + coord_flip() ``` <img src="index_files/figure-html/unnamed-chunk-24-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A">Tu turno </span> - Incluir en el gráfico anterior la variable `sexo` para tener un gráfico de barras apiladas al 100% para la variable `dia` según `sexo` - Cambiar la paleta de colores a Dark2 usando `scale_fill_discrete` - Cambiar las etiquetas de días usando `scale_x_discrete` a Jueves, Viernes, Sábado y Domingo. --- ## <span style="color:#88398A">Tu turno: sol </span> ```r ggplot(data = propinas, aes(x = fct_infreq(dia), fill = sexo)) + geom_bar(position = "fill") + scale_x_discrete( labels = c('Vi'='Viernes', 'Ju'= 'Jueves', 'Sa' = 'Sábado', 'Do' = 'Domingo' )) + scale_fill_brewer(palette = "Dark2") + coord_flip() ``` <img src="index_files/figure-html/unnamed-chunk-25-1.png" style="display: block; margin: auto;" /> --- ## <span style="color:#88398A"> Más geoms</span> http://ggplot2.tidyverse.org/reference/ --- ## <span style="color:#88398A"> Extensiones</span> Hay 40 extensiones de `ggplot2` http://www.ggplot2-exts.org/gallery/ --- ## <span style="color:#88398A">`ggplot2` ayuda</span> Lista de mails: http://groups.google.com/group/ggplot2 stackoverflow: http://stackoverflow.com --- ## <span style="color:#88398A"> Visualización interactiva</span> Hay dos componentes claves que deben ser cumplidos para una visualización interactiva: - Interacciones en cada visualización individual (mouse sobre etiquetas e información, zoom, mover) <!-- casi todos las tienen --> - Links entre distintos gráficos <!-- pocos tienen esto --> Adicionalmente ser capaz de controlar rotaciones dinámicas en altas dimensiones <!-- no lo tienen --> --- ## <span style="color:#88398A"> Porqué usar Visualización interactiva</span> - Podemos encontrar conexiones que no pueden ser vistas en un gráfico estático - Permite comprometernos con los datos de una forma que no es posible con estáticos - Podemos enfocarnos en áreas que nos interesan más (zoom) - Resaltar los datos que más nos interesan y ocultar los que no --- ## <span style="color:#88398A"> `plotly`</span> - plotly es una empresa <a name=cite-plotly></a>[Inc. (2015)](https://plot.ly) que mantiene el paquete `plotly` de R para hacer visualización interactiva - Mantenido por Carson Sievert <a name=cite-sievert2016plotly></a>[Sievert, Parmer, Hocking, Chamberlain, Ram, Corvellec, and Despouy (2016)](#bib-sievert2016plotly) Versión en desarrollo ```r if (!require("devtools")) install.packages("devtools") devtools::install_github("ropensci/plotly") ``` --- ## <span style="color:#88398A"> Como iniciar un objeto plotly</span> - `ggplotly` transforma un objeto `ggplot` en un objeto `plotly` - `plot_ly` transforma datos en un objeto `plotly` Ambos producen una visualización interactiva que incluye por defecto ( tooltips, zooming y panning) <!-- zoomint, panning and tooltip --> --- ## <span style="color:#88398A"> `ggplot2` y `plotly`</span> - Con `plotly` podemos transformar un gráfico estático generado con `ggplot2` a uno interactivo usando `ggplotly` ```r library(plotly) pl <- ggplot(propinas, aes(total, propina, colour = sexo)) + geom_point() ggplotly(pl) ``` --- ## <span style="color:#88398A"> Iniciar plotly con `ggplotly`</span>
Por defecto utiliza todos los elementos estéticos (`aes`) en las etiquetas --- ## <span style="color:#88398A"> `ggplotly`: personalizar `tooltip`</span> - Argumento `tooltip` para restringir `aes` ```r pl <- ggplot(propinas, aes(total, propina, colour = sexo)) + geom_point() ggplotly(pl, tooltip = c("total", "propinas")) ``` --- ## <span style="color:#88398A"> `ggplotly`: personalizar `tooltip`</span> - Argumento `tooltip` para restringir `aes`
--- ## <span style="color:#88398A"> `ggplotly`: personalizar `tooltip`</span> - Argumento `tooltip` para restringir `aes` ```r library(plotly) pl <- ggplot(propinas, aes(total, propina, colour = sexo, text = paste('Sexo', sexo))) + geom_point() ggplotly(pl, tooltip = "text") ``` --- ## <span style="color:#88398A"> `ggplotly`: personalizar `tooltip`</span> - Argumento `tooltip` para restringir `aes`
--- ## <span style="color:#88398A"> `ggplotly` seleccionar una clase</span> ```r propi <- highlight_key(propinas, ~sexo) pl <- ggplot(propi, aes(total, propina, colour = sexo, text = paste('Sexo', sexo)), group = sexo) + geom_point() gg <- ggplotly(pl, tooltip = "text") highlight(gg, on = "plotly_click") ``` --- ## <span style="color:#88398A"> `ggplotly` seleccionar una clase</span>
--- ## <span style="color:#88398A"> `ggplotly` seleccionar una clase</span> ```r propi <- highlight_key(propinas) pl <- ggplot(propi, aes(total, propina, colour = sexo, text = paste('Sexo', sexo)), group = sexo) + geom_point() gg <- ggplotly(pl, tooltip = "text") highlight(gg, on = "plotly_selected") ``` --- ## <span style="color:#88398A"> `ggplotly` seleccionar una clase</span>
--- ## <span style="color:#88398A"> `highlight` otros</span>
--- ## <span style="color:#88398A"> `highlight` otros</span> ```r highlight(gg, on = "plotly_hover", selectize = TRUE, dynamic = TRUE) ```
--- ## <span style="color:#88398A"> Iniciar plotly con `plot_ly`</span> ```r pl2 <- plot_ly(data = propinas, x = ~total, y = ~propina, color = ~sexo) ``` --- ## <span style = "color:#88398A"> Iniciar plotly con `plot_ly` </span>
--- ## <span style = "color:#88398A">Más plotly </span> Combinar varios gráficos
--- ## <span style = "color:#88398A">Más plotly </span> ```r d <- highlight_key(mpg) dots <- plot_ly(d, color = ~class, x = ~displ, y = ~cyl) boxs <- plot_ly(d, color = ~class, x = ~class, y = ~cty) %>% add_boxplot() bars <- plot_ly(d, colors = "Set1", x = ~class, color = ~class) subplot(dots, boxs, titleX = TRUE, titleY = TRUE) %>% subplot(bars, nrows = 2, titleX = TRUE, titleY = TRUE) %>% layout( barmode = "overlay", showlegend = FALSE ) %>% highlight("plotly_selected") ``` --- ## <span style = "color:#88398A">Material plotly </span> https://plotly-book.cpsievert.me --- ## <span style = "color:#88398A">FIN </span> GRACIAS POR LA ATENCIÓN - natalia@iesta.edu.uy - @pacocuak - http://natydasilva.com --- ## <span style = "color:#88398A"> </span> --- # References <a name=bib-anscombe></a>[Anscombe F, J.](#cite-anscombe) (1973). "Graphs in statistical analysis". In: _The American Statistician_. <a name=bib-cleveland></a>[Cleveland William, S. and R. McGuill](#cite-cleveland) (1985). " Graphical perception and graphical methods for analyzing scientific data ". <a name=bib-gelman2002let></a>[Gelman, A, C. Pasarica and R. Dodhia](#cite-gelman2002let) (2002). "Let's practice what we preach: turning tables into graphs". In: _The American Statistician_ 56.2, pp. 121-130. <a name=bib-plotly></a>[Inc., P. T.](#cite-plotly) (2015). _Collaborative data science_. URL: [https://plot.ly](https://plot.ly). <a name=bib-matejka2017same></a>[Matejka, J. and G. Fitzmaurice](#cite-matejka2017same) (2017). "Same stats, different graphs: generating datasets with varied appearance and identical statistics through simulated annealing". In: _Proceedings of the 2017 CHI Conference on Human Factors in Computing Systems_. ACM. , pp. 1290-1294. <a name=bib-sievert2016plotly></a>[Sievert, C, C. Parmer, T. Hocking, et al.](#cite-sievert2016plotly) (2016). "plotly: Create Interactive Web Graphics via ‘plotly. js’". In: _R package version_ 3.0. <a name=bib-tukey77></a>[Tukey, J. W.](#cite-tukey77) (1977). "Exploratory Data Analysis". <a name=bib-wickham2016ggplot2></a>[Wickham, H.](#cite-wickham2016ggplot2) (2016). _ggplot2: elegant graphics for data analysis_. Springer. <a name=bib-wilkinson2006grammar></a>[Wilkinson, L.](#cite-wilkinson2006grammar) (2006). _The grammar of graphics_. Springer Science & Business Media.