Algunas librerías de visualización.

library(networkD3) # Generar redes con D3
library(tidyverse) # Manipular bases de datos
library(readxl) # Leer datos de excel 
library(highcharter) # Graficas de HighCharter
library(r2d3) # Convertir visualizaciones de D3
library(viridis) # Colores de la paleta viridis
library(xts) # Generar datos xts de series de tiempo
library(dygraphs) # Generar viz de Series de Tiempo
library(leaflet) # Generar mapas interactivos
library(plotly) # Generar gráficas interactivas
library(DT) # Generar tablas interactivas
library(kableExtra) # Generar tablas bonitas
# HIGHCHARTER
# highcharter::renderHighchart()
# highcharter::highchartOutput()

# R2D3
# r2d3::renderD3()
# r2d3::d3Output()

# NETWORKD3
# tiene una fn especial para cada tipo de red.
# networkD3::renderForceNetwork()
# networkD3::forceNetworkOutput()

Gráficas de redes interactivas {networkD3}

Revisar Documentación acá

A continuación se muestra el código necesario para construir una visualización de la interacción de los personajes de la Novela de “Los Miserables” de “Victor Hugo”.

# Guardamos bases de ejemplo 
MisLinks <- networkD3::MisLinks
MisNodes <- networkD3::MisNodes 

# Exploramos datos 
head(MisLinks)
##   source target value
## 1      1      0     1
## 2      2      0     8
## 3      3      0    10
## 4      3      2     6
## 5      4      0     1
## 6      5      0     1
head(MisNodes)
##              name group size
## 1          Myriel     1   15
## 2        Napoleon     1   20
## 3 Mlle.Baptistine     1   23
## 4    Mme.Magloire     1   30
## 5    CountessdeLo     1   11
## 6        Geborand     1    9

Para generar una red, en este ejemplo, necesitamos dos bases de datos: una que describa los nodos (MisNodes) y otra que describa los enlaces (MisLinks). El tener los datos en este formato nos va a permitir

Después, generamos la red.

# Realizar la visualización.
forceNetwork(Links = MisLinks, 
             Nodes = MisNodes,
             Source = "source", 
             Target = "target", 
             Value = "value", 
             NodeID = "name", 
             Nodesize = "size",
             Group = "group", 
             opacity = 0.8,
             width = 600, 
             height = 600, 
             fontSize = 15)

Diagrama de Sankey.

En visualización, los Diagramas de Sankey son gráficos que nos permiten ver traslados, desplazamientos o movimientos entre distintos elementos a lo largo del tiempo.

# #Número de viajes provenientes de la CDMX reportados por la Encuesta Origen y Destino del INEGI.
datosankey <- readRDS("Datos/datosSankey.rds")

# Exploramos los datos. 
head(datosankey)
##              source               target value IDsource IDtarget
## 1 Gustavo A. Madero Tlalnepantla de Baz   1136        0       11
## 2        Cuauhtémoc Ecatepec de Morelos   1263        1       12
## 3 Gustavo A. Madero Ecatepec de Morelos   1792        0       12
## 4        Iztapalapa      Nezahualcóyotl   1246        2       13
## 5        Cuauhtémoc      Nezahualcóyotl   1166        1       13
## 6     Benito Juárez      Álvaro Obregón   1246        3       14

Para generar una gráfica de Sankey, necesitamos datos de origen, destino y volumen desplazado.

datosankey <- read.csv("Datos/datosankey.csv") #Número de viajes provenientes de la CDMX reportados por la Encuesta Origen y Destino del INEGI.

datosankey$target <- paste(datosankey$target, " ", sep="") 

nodes <- data.frame(name=c(as.character(datosankey$source), as.character(datosankey$target)) %>% unique()) 
datosankey$IDsource=match(datosankey$source, nodes$name)-1 
datosankey$IDtarget=match(datosankey$target, nodes$name)-1

sankeyNetwork(Links = datosankey, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name", 
              sinksRight=FALSE, nodeWidth=60,
              fontSize=10,
              nodePadding=8)->sankey
sankey

Heatmaps en highcharter

También podemos elaborar Mapas de calor.

#Series de tiempo del número de personas/ciclistas/peatones atropelladas
accidentes_peatones <- read.csv("Datos/accidentes_peatones.csv")  

# Exploramos la base
head(accidentes_peatones)
##         Date delegacion_inicio value
## 1 2014-04-01    ALVARO OBREGON   141
## 2 2014-04-01      AZCAPOTZALCO    70
## 3 2014-04-01     BENITO JUAREZ   129
## 4 2014-04-01          COYOACAN   171
## 5 2014-04-01        CUAJIMALPA    30
## 6 2014-04-01        CUAUHTEMOC   286
# Elaboramos un heatmap 
accidentes_peatones %>%
# Creamos el heatmap  
  hchart(type = "heatmap", 
         name = "Atropellamientos",
  # Tooltip (ventanita)       
         tooltip = list(pointFormat = "Cantidad:  {point.value} sucesos"),
  
         hcaes(x = Date, 
               y = reorder(delegacion_inicio,value),
               value = value)) %>% 
  # Titulo de la grafica
  hc_title(text = "Atropellamientos a ciclistas o peatones en la Ciudad de México") %>% 
  # Modificaciones del eje X
  hc_xAxis(categories = accidentes_peatones$Date, 
           title = list(text = "<b>Fecha</b>"), 
           type = "datetime") %>% 
  # Modificacion del eje Y
  hc_yAxis(title = list(text = "")) %>%
  # Modificacion de la paleta de colores
  hc_colorAxis(stops = color_stops(colors = viridis::viridis(10)))

Series de tiempo con dygraph.

Documentación: https://rstudio.github.io/dygraphs/

La librería dygraph nos permite generar gráficas de series de tiempo con controles de selección de rangos pre-programadas.

# Datos. Reciclaremos los datos de arriba. 
iztapalapa <- accidentes_peatones %>% 
  filter(delegacion_inicio == "IZTAPALAPA")

izta_xts <- xts(x = iztapalapa$value, 
    order.by = as.Date(iztapalapa$Date)) 

# Generamos la gráfica
dygraph(izta_xts, 
        main = "Accidentes en Iztapalapa") %>%
      dyRangeSelector(dateWindow = c(as.Date(iztapalapa$Date[1]), 
    iztapalapa$Date[nrow(iztapalapa)])) %>%
  dyOptions(stackedGraph = TRUE) %>%
  dyRangeSelector(height = 20)

Treemap.

Documentación: https://jkunst.com/highcharter/

La librería highcharter brinda todo el poder de las visualizaciones de la librería highcharts de Javascript.

A continuación, veremos un ejemplo de como realizar visualizaciones estilo treemap con esta librería. Un treemap nos permite comparar magnitudes entre muchas categorías, lo cual lo presenta como una opción para los casos en que tengamos un número grande de categorías y no sean adecuados el uso de barras o de gráficas de pastel.

#Monto total aprobado en el PEF2020 por Ramo
pef <- read.csv("Datos/pef.csv") 

# Exploramos 
head(pef)
##   ID_RAMO                                                      DESC_RAMO
## 1      28           Participaciones a Entidades Federativas y Municipios
## 2      19                                Aportaciones a Seguridad Social
## 3      50                           Instituto Mexicano del Seguro Social
## 4      33 Aportaciones Federales para Entidades Federativas y Municipios
## 5      52                                            Petróleos Mexicanos
## 6      24                                                  Deuda Pública
##      total
## 1 951454.8
## 2 863611.8
## 3 825062.9
## 4 759760.3
## 5 637158.5
## 6 538349.3
# Elaboramos el treemap
pef %>% 
  hchart(type= "treemap", hcaes(x = DESC_RAMO, 
                                value = total, 
                                color = total)) %>% 
  hc_title(text = "Presupuesto de Egresos de la Federación 2020 (Cifras en millones de pesos)") %>%
  hc_colorAxis(stops = color_stops(colors = viridis::inferno(10)))

Visualizaciones con D3.js

Documentación: https://jkunst.com/highcharter/

La librería de visualización más avanzada del mundo (en mi opinión) es la librería D3.js.

Esta es una librería de Javascript que nos permite generar elemento a elemento los elementos gráficos, los efectos, los movimientos y las visualizaciones de nuestras gráficas.

Estas visualizaciones las podemos incorporar en un RMarkdown o en un shiny a través de la librería r2d3.

# Leemos los datos
data<- read_excel("Datos/flare.xlsx")

# Elaboramos la visualización
r2d3(data, 
     d3_version = 4, 
     script = "Datos/bubbles.js")