Seguiremos utilizando los mismos paquetes que la parte anterior.
Code
# ejecutar estas líneas para poder instalar {datos}# install.packages("remotes")# remotes::install_github("cienciadedatos/datos")library(datos)# datoslibrary(highcharter)# gráficoslibrary(ggplot2)# más gráficos library(dplyr)# manipulación de datoslibrary(tidyr)# más manipulación de datos
Mapa de calor. Usualmente se utiliza para visualizar relaciones entre dos variables categorícas (o 2 contínuas categorizandolas). En este ejemplo utilizaremos día y hora como una variables “numericas discretas”.
Caso de heatmaps son los visualizar distancia entre observaciones/individuos.
Code
mtautos2<-mtautos[1:20, ]matriz_distancias<-dist(mtautos2)hchart(matriz_distancias)%>%hc_title(text ="Distancia entre características de los vehículos")
Medio/Avanzado. Es la implementación de este ejemplo https://www.highcharts.com/demo/heatmap-canvas. Notar la relación de opciones en HighchartsJS y {highcharter}.
Code
# install.packages("aimsir17")library(lubridate)data(observations, package ="aimsir17")temperaturas<-observations%>%filter(station=="KNOCK AIRPORT")%>%select(fecha =date, hora =hour, temperatura =temp)%>%mutate(fecha =as.Date(fecha))# temperaturas %>% # count(fecha, hora) %>% # count(n)hc11<-hchart(temperaturas,"heatmap",hcaes(datetime_to_timestamp(fecha), hora, value =temperatura), colsize =36e5*24# 1 hour * 24 = 1 day)%>%hc_title(text ="Temperaturas del aeropuerto Knock")%>%hc_subtitle(text ="Datos obtenidos del paquete {aimsir17}.")%>%hc_chart(zoomType ="x")%>%hc_xAxis( type ="datetime", title =list(text =FALSE), showLastLabel =FALSE)%>%hc_yAxis( minPadding =0, maxPadding =0, startOnTick =FALSE, endOnTick =FALSE, tickPositions =list(0, 6, 12, 18, 24), tickWidth =1, min =0, max =23, reversed =TRUE, labels =list(format ="{value}:00"), title =list(text =FALSE))%>%hc_tooltip( headerFormat ="Temperatura<br/>", pointFormat ="{point.x:%e %b, %Y} {point.y}:00: <b>{point.value} ℃</b>")%>%hc_colorAxis( stops =color_stops(10, colors =scales::viridis_pal(option ="B")(10)),# fuerza a utilzar mejor el espectro de colores para que HJS no amplie el# eje para tener numero "redondos startOnTick =FALSE, endOnTick =FALSE)%>%hc_legend( align ="right", layout ="vertical", verticalAlign ="top")hc11
Día 12: paleta (lollipop)
Gráfico que se utiliza en forma general para describir una variable numérica para un set de individuos/registros (a diferencia de gráfico de barra que usualmente se utiliza sumando cantidades por categoría).
Los datos a utilizar son mtautos del paquete {datos} pero pasando algunas variables a las métricas que usualemente utilizamos: libras a kilos, pulgadas cúbicas a centímeotrs cúbicos, etc.
La implementación en {highcharter} es directa, solamente usar el mapeo de name para la variable categórica y low para la numérica (low dado que esta es una modificación del gráfico de dumbbell que utiliza además high).
Basico/Medio. En esta oportunidad haremos un tooltip de tipo tabla con el fin de mostrar más información que los HP de cada vehículo. Para esto usaremos la función auxiliar tooltip_table en el argumento pointFormat.
Code
x<-c("Caballos:", "Peso", "Cilindrada")y<-c("{point.y} HP","{point.peso_kg} kg","{point.cilindrada_cc} cc")hc12<-hchart(mtautos2, "lollipop", hcaes(name =auto, low =caballos), name ="caballos (HP)")%>%hc_xAxis(type ="category")%>%hc_yAxis(labels =list(format ="{value} HP"))%>%hc_tooltip( useHTML =TRUE, pointFormat =tooltip_table(x, y))%>%hc_title( text ="Caballos de fuerza para autómóviles de Motor Trend")%>%hc_subtitle( text ="Los datos fueron extraídos de la revista Motor Trend de Estados Unidos de 1974, y tiene datos de consumo de combustible y 10 aspectos de diseño y rendimiento para 32 automóviles (modelos de 1973-1974).")hc12
Día 13: visualizar datos temporales
Notar que el último gráfico del día 11 es un caso particular de de visualizar datos temporales.
Usualmente en R los datos temporales o serie de tiempo vienen en un objecto de clase ts (time series) que básicamente son valores numéricos asociado a una fecha (o índice). Notar que también datos temporales pueden perfectamente almacenarse en un data.frame, nota los datos observations del día 11.
Para grafica objectos de clase ts en {highcharter} es bastante directo dado que hchart es una función genérica. Esto significa que la función dependiendo de la clase del objeto la interpretará/graficará de la forma que corresponde. Por ejemplo ts y data.frame son clases que la función hchart reconoce, y existen muuuchas más clases que hchart puede interpretar, intenta correr methods("hchart") para listar todas las clases que actualmente esta función soporta.
Volviendo a nuestro gráfico en R existe los datos co2 que son una serie de tiempo (clase ts).
Time-Series [1:468] from 1959 to 1998: 315 316 316 318 318 ...
Code
hc13<-hchart(co2, name ="Concentración")%>%hc_title(# para poder usar el tag html "sub" para subindices useHTML =TRUE, text ="Concentración atomsférica de CO<sub>2</sub> en Mauna Loa")%>%hc_subtitle( text ="Las concentraciones atmosféricas de CO2 se expresan en partes por millón (ppm) y se informan en la escala preliminar de fracción molar manométrica SIO de 1997.")hc13
Aprovechando que estamos revisando series de tiempo, podemos hacer una descomposición usando Loess (suavizamiento). La función stl toma un serie de tiempo descomponiéndola en tendencia, componente estacional y ruido.
Como veremos, el gráfico se realiza simplemente como hchart(descomposicion):
Code
descomposicion<-stl(co2, "per")hc132<-hchart(descomposicion)%>%hc_tooltip(valueDecimals =2)%>%hc_title( useHTML =TRUE, text ="Descomposición de la Concentración atomsférica de CO<sub>2</sub> en Mauna Loa utilizando la funcion <code>stl</code>")%>%hc_subtitle( text ="<b>Descripción del comando <code>stl</code></b>: El componente estacional se encuentra al suavizar loess la sub-serie estacional (la serie de todos los valores de enero, ...); si s.window = 'periódico' suavizado se reemplaza efectivamente tomando la media. Los valores estacionales se eliminan y el resto se suaviza para encontrar la tendencia. El nivel general se elimina del componente estacional y se agrega al componente de tendencia. Este proceso se repite varias veces. El componente restante son los residuos del ajuste estacional más tendencial.")%>%hc_tooltip(table =TRUE)%>%hc_size(height ="700px")hc132
Para finalizar ejemplificaremos la integración de {highcharter} con el paquete {forecast} con el cual se puede realizar predicciones de los datos de forma simple.
Code
library(forecast)pronosticos<-forecast(ets(USAccDeaths), h =48, level =95)hc133<-hchart(pronosticos)%>%hc_title( text ="Muertes por accidentes en los EE. UU. 1973–1978 más predicciones generadas utilizando {forecast}")%>%hc_tooltip(shared =TRUE, valueDecimals =2)hc133
Día 14: treemaps
Es un buen gráfico para sustituir el gráfico de barras cuando la cantidad de categorías aumentan. También sirve como alternativa a los gráficos de torta o dunut (ñami!)
hchart(conteo_clases,"treemap",hcaes(clase, value =n, colorValue =n), borderColor =NA# elimina border y se tiene un aspecto más limpio imho)%>%hc_colorAxis(stops =color_stops())%>%hc_title(text ="Conteo de tipos de automóviles en los datos 'millas'")%>%hc_colorAxis(endOnTick =FALSE)
Avanzado. Este es una guia en español para hacer un treemap mostrando la cardinalidad de cada tipo y subtipo de pokemon. Primero descargaremos los datos desde el repositorio https://github.com/PokeAPI/pokeapi/tree/master/data/v2/csv.
pkmn_nombre_tipos<-read_csv(file.path(url_base, "type_names.csv"))%>%# inglés es 9, Japonez es 1, español 7filter(local_language_id==9)pkmn_tipo<-read_csv(file.path(url_base, "pokemon_types.csv"))pkmn_tipo<-pkmn_tipo%>%mutate(slot =paste0("type_", slot))%>%left_join(pkmn_nombre_tipos, by ="type_id")%>%select(pokemon_id, slot, name)%>%spread(slot, name)
Ahora, la gracia del treemap que haremos es que serán los colores. Esto es lo que hara llamativo nuestro gráfico.
Ahora, calcularemos todas las combinaciones entre todos los colores para luego promediarlos y generar un matiz entre el color con el del segundo tipo. Esto se hace con la función colorRampPalette.
A continuación, finalmente, uno de los treemaps del cual estoy orgulloso! :)
Code
hc14<-highchart()%>%hc_chart(type ="treemap")%>%hc_title( text ="Pokemon por tipos")%>%hc_add_series( data =dd, allowDrillToNode =TRUE, levelIsConstant =FALSE, textOverflow ="clip", dataLabels =list(color ="white"), levels =list(list( level =1, borderWidth =1, dataLabels =list( enabled =TRUE, verticalAlign ="top", align ="left", style =list(fontSize ="12px", textOutline =FALSE))),list( level =2, borderWidth =0, dataLabels =list(enabled =FALSE))))%>%# esto es para que el primer nivel, que no tiene color asigando, # sea transparente.hc_colors("trasnparent")hc14%>%hc_size(height =800)