class: center, middle, inverse, title-slide # RMadrid: htmlwidgets ## Grupo de Usuarios R Madrid ### Jorge Ayuso Rejas --- class: inverse, center, middle # ¿el principio del fin de ggplot? --- ## Tipos de gráficos (según yo) Cuando estoy trabajando con datos distingo dos tipos de gráficos: -- ### los míos Suelen ser feos, técnicos y que uso de manera exploratoria para entender los datos. -- ### para otros Suelen ser más bonitos, fáciles de entender y autoexplicativos (por lo menos intento que sean así...). --- .left-column[ ## Gráficos básicos *en la intimidad* ] .right-column[ ```r par(mfrow=c(1,2)) boxplot(Sepal.Length~Species,iris,col=2:4) plot(density(iris$Sepal.Length)) ``` <img src="index_files/figure-html/basicos-1.png" style="display: block; margin: auto;" /> ] --- .left-column[ ## Gráficos de calidad `ggplot2` ] .right-column[ ```r ggplot( Titanic, aes(x = Survived,y = Freq,fill = Class) ) + geom_bar(stat = "identity") + facet_wrap(~Sex) + theme_bw() + scale_fill_manual( values = c("#69D2E7","#A7DBD8","#E0E4CC","#F38630") ) ``` <img src="index_files/figure-html/ggplot-1.png" style="display: block; margin: auto;" /> ] --- ## ¿Cuántas veces imprimes una presentación? > *"Esto me lo pones en una PPT"* > *"Esto está muy bien pero mejor una PPT de toda la vida"* > ... -- .center[ ![gif](./img/matar.gif) ] --- class: center, middle, inverse ## Los gráficos javascript molan ![js](./img/Mmww2.png) --- .left-column[ ## Gráficos javascript ] .right-column[ Los gráficos en `javascript` son interactivos, están diseñados por y para las webs, también podemos usarlos en presentaciones (como en esta!), no se pixelan, y nos puende aportar mucha más información con un click. > OK, me has convencido, pero yo no sé `javascript`... ] -- .right-column[ **¡No pasa nada! Desde `R` podemos crearlos sin tener ni idea** <center> <div style="margin: 50px;"> <i style="color:#FFD700;" class="fa fa-trophy fa-5x"></i> </div> </center> ] --- .left-column[ ## Gráficos javascript ## Ejemplos ] .right-column[ En `R` existen paquetes con esta idea desde finales de 2010 aunque en los dos últimos años se han disparado. ] -- .right-column[ Algunos de estos son: <style> .listado li{ margin:7px 0; } </style> .listado[ * `googleVis`: https://cran.r-project.org/web/packages/googleVis/index.html * `rCharts`: http://ramnathv.github.io/rCharts/ * `ggvis`: http://ggvis.rstudio.com/ * `plotly`: https://plot.ly/r/ * `leaflet`: https://rstudio.github.io/leaflet/ * `DT`: https://rstudio.github.io/DT/ * `rbokeh`: http://hafen.github.io/rbokeh/ * `dygraphs`: https://rstudio.github.io/dygraphs/ * `networkD3`: https://christophergandrud.github.io/networkD3/ * `highcharter`: http://jkunst.com/highcharter/ * `DiagrammeR`: http://rich-iannone.github.io/DiagrammeR/ * ... ] ] --- .left-column[ ## Ejemplos ### - highcharter ] .right-column[ Mi favorito. Permite realizar todo tipo de visualizaciones y reproducir cualquier gráfico "tipico excel" que tengamos en la cabeza. Además es un paquete muy moderno, con una documentación muy buena y altamente configurable. <style> .highchart{ height: 360px !important; } </style> ```r library(highcharter) hchart( mpg, "scatter", hcaes(x = displ, y = hwy, group = class) ) ```
] --- .left-column[ ## Ejemplos ### - highcharter ### - dygraphs ] .right-column[ Paquete muy recomendable para series temporales, además es compatible con los objetos de tipo serie temporal y sus predicciones. ```r library(dygraphs) hw <- HoltWinters(ldeaths) predicted <- predict(hw, n.ahead = 72, prediction.interval = TRUE) dygraph(predicted, main = "Predicted Lung Deaths (UK)") %>% dyAxis("x", drawGrid = FALSE) %>% dySeries(c("lwr", "fit", "upr"), label = "Deaths") ```
] --- .left-column[ ## Ejemplos ### - highcharter ### - dygraphs ### - leaflet ] .right-column[ El rey de los mapas, nos permite hacer visualizaciones de puntos, líneas, polígonos... ```r library(leaflet) leaflet() %>% addProviderTiles(providers$CartoDB.Positron) %>% addMarkers( lng=-3.6959795, lat=40.41052682, popup="Meetup R" ) ```
] --- .left-column[ ## Ejemplos ### - highcharter ### - dygraphs ### - leaflet ### - DiagrammeR ] .right-column[ Hay sitio para todo, también para los esquemas. Escribiéndolos a mano o convierto desde un grafo de `igraph` podemos realizar esquemas para nuestras presentaciones y proyectos. ```r library(DiagrammeR) grViz(" digraph a_nice_graph { node [fontname = Helvetica] a -> {b c d} c -> d } ") ```
] --- class: center, middle, inverse ## ¿Qué tienen en común? --- class: center, middle # htmlwidgets http://www.htmlwidgets.org/ --- ## htmlwidgets > Bring the best of JavaScript data visualization to R -- + Puedes usar los gráficos igual que un `plot` desde la consola ```r library(highcharter) hchart(AirPassengers) ``` -- + Es totalmente compatible con `rmarkdown` y `shiny` ```r outpus$serie <- renderHighchart({ hchart(input$data) }) ``` -- + Nos facilita mucho crear nuevos paquetes... --- ## He venido a hablar de mi librería: <center> <h2><tt>LiquidGaugeR</tt></h2>
</center> --- .left-column[ ## LiquidGauge ### - Idea inicial ] .right-column[ En la web de `htmlwidget` existe un tutorial de como crear nuevos paquetes, quería probar así que busqué un gráfico fácil y sencillo para seguir el [tutorial](http://www.htmlwidgets.org/develop_intro.html): <style> .container { display: flex; /* or inline-flex */ justify-content: space-between; margin: 120px 0 20px 0; } </style> .container[
] <center> <a href="http://bl.ocks.org/brattonc/5e5ce9beee483220e2f6">http://bl.ocks.org/brattonc/5e5ce9beee483220e2f6</a> </center> ] --- .left-column[ ## LiquidGauge ### - Idea inicial ### - La estructura ] .right-column[ Creamos la estructura del paquete: ```r devtools::create("LiquidGaugeR") setwd("LiquidGaugeR") htmlwidgets::scaffoldWidget( "LiquidGaugeR", bowerPkg = "d3-liquid-fill-gauge" ) devtools::install() ``` Obtenemos la siguiente estructura: ```bash ├── inst │ └── htmlwidgets │ └── lib │ ├── d3 │ └── d3-liquid-fill-gauge ├── man └── R ``` ] --- .left-column[ ## LiquidGauge ### - Idea inicial ### - La estructura ### - Los *bindings* ] .right-column[ Es hora de crear los *bindings*, aquí hay que escribir un poco de `javascript`: ```r HTMLWidgets.widget({ name: 'liquid_gauge', type: 'output', factory: function(el, width, height,x) { var id_gauge = el.id+"_gauge"; d3.select(el) .append("svg") .attr("width", width) .attr("height", height) .attr("id",id_gauge); var gauge = d3.select("#"+id_gauge); return { gauge.call(d3.liquidfillgauge,x.number,x.options) }; } }); ``` ] --- .left-column[ ## LiquidGauge ### - Idea inicial ### - La estructura ### - Los *bindings* ### - Desde `R` ] .right-column[ Desde `R` usamos la función creada: <style> .html-widget{ margin-left: auto; margin-right: auto; } </style> ```r library(LiquidGaugeR) opt <- list( circleThickness = 0.15, circleColor = "#808015", textColor = "#555500", waveTextColor = "#FFFFAA", waveColor = "#AAAA39", textVertPosition = 0.8, waveAnimateTime = 1000, waveHeight = 0.05, waveCount = 3 ) liquid_gauge(32,options = opt) ```
] --- ## Conclusiones -- + El paquete `htmlwidgets` nos permite crear visualizaciones de `javascript` desde R. -- + Existe multitud de paquetes para todo tipo necesidades. -- + También nos aporta un `framework` para hacer nuevos paquetes de manera sencilla. -- + Aprender algo de `D3.js` viene bien: https://www.meetup.com/es-ES/Madrid-D3-js/. -- + Yo he dejado de usar practicamente `ggplot`. --- class: center, middle, inverse # ¡Gracias! <style> .footnote{ width: 100%; text-align: left; } .footnote a{ color: inherit; text-decoration: inherit; } </style> .footnote[ Jorge Ayuso Rejas <a href="https://github.com/jayusor/"><i class="fa fa-github"></i></a> <a href="https://www.linkedin.com/in/jorgeayusorejas/"><i class="fa fa-linkedin"></i></a> <a href="https://twitter.com/jayusor"><i class="fa fa-twitter">@jayusor</i></a> <div style="position:absolute;right:100px;top:18px;"> <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Licencia Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a> </div> ] -- ### ¿Dudas?