Visualización de Datos Interactiva.

En esta sección repasaremos ahora visualizaciones que no tienen que ver con la librería plotly.

Librerias

library(tidyverse) # Manejo de bases de datos 
library(plotly) # Graficas interactivas
library(htmlwidgets) # Widgets de html (para guardar las paginas)
library(dygraphs) # Para hacer series de tiempo
library(highcharter) # Para hacer treemaps y otras visualizaciones
library(networkD3) # Generar redes con D3
library(igraph) # Para manejo de información de redes

library(janitor) # Limpieza de nombres en las tibbles
library(readxl) # Leer exceles
library(scales) # Formatos especiales en los ejes
library(xts) # Creación de objetos de series de tiempo
library(hrbrthemes) # Temas de ggplot
library(viridis) # Paletas viridis
library(gapminder) # Bases de datos de gapminder. 
library(rtweet)

3.5 Treemaps de exportaciones y de presupuestos.

Los treemaps son un tipo de visualización que permite mostrar una gran cantidad de datos que pertenecen a un todo ( part-to-whole). En estos, el espacio de la visualización está dividido en rectángulos a los que se les asigna un tamaño y un orden en función de una variable cuantitativa.

Para este ejemplo, vamos a utilizar las funciones de la librería highcharter

# Datos de exportaciones 
exp <- read_csv("Bases de datos/mexico_exports.csv")
# Gráfica de Highcharter
exp %>% 
  mutate(level = as.numeric(factor(Sector))) %>% 
  hchart(type= "treemap", hcaes(x = Name, 
                                value = Share, 
                                color = level)) %>% 
  hc_title(text = "Productos de exportación 2018") %>%
  hc_colorAxis(stops = color_stops(colors = viridis::inferno(20)))
# Leemos los datos del Presupuesto 2020
pef <- read_csv("Bases de datos/pef.csv")
# 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)))

3.6 Networks (redes y relaciones)

# Datos ----
nodos = readxl::read_xlsx("Bases de datos/relaciones One Piece.xlsx",
                          sheet = "nodos")

enlaces = readxl::read_xlsx("Bases de datos/relaciones One Piece.xlsx",
                            sheet = "conexiones")
# Armamos los datos de la red ----
network <- graph_from_data_frame(d=enlaces,
                                 vertices=nodos,
                                 directed=F)
# Exploramos el objeto
network
## IGRAPH e06bdc5 UN-- 161 470 -- 
## + attr: name (v/c), tipo (v/c), tamaño (v/n), tipo_enlace (e/c)
## + edges from e06bdc5 (vertex names):
##  [1] Monkey D. Luffy--Dadan               Monkey D. Luffy--Monkey D. Garp     
##  [3] Monkey D. Luffy--Monkey D. Dragon    Monkey D. Luffy--Portgas D. Ace     
##  [5] Roronoa Zoro   --Kuina               Roronoa Zoro   --Koushiro-sensei    
##  [7] Roronoa Zoro   --Dracule Mihawk      Vinsmoke Sanji --Restaurante Baratie
##  [9] Vinsmoke Sanji --Zeff                Nami           --Piratas de Arlong  
## [11] Nami           --Nojiko              Nami           --Bell-mère          
## [13] Nico Robin     --Nico Olvia          Usopp          --Piratas de Usopp   
## [15] Usopp          --Yassop              Usopp          --Banchina           
## + ... omitted several edges
# Checamos de que clase es el objeto 
class(network)
## [1] "igraph"
# Graficamos la red
plot(network)

# Generamos datos compatibles para un force Network
Links = networkD3::igraph_to_networkD3(network)[[1]]
Nodes = networkD3::igraph_to_networkD3(network)[[2]]
Nodes$size = nodos$tamaño
class(Nodes)
## [1] "data.frame"
Nodes$group = nodos$tipo

# Funcion para presionarle a algun nodo de interes
MyClickScript <- 'alert("Seleccionaste a  " + d.name + " que esta en la fila " +
       (d.index + 1) +  " de tu dataframe original");'

net = forceNetwork(Links = Links,
                   Nodes = Nodes,
                   Nodesize = "size",
                   NodeID = "name",
                   Group = "group",
                   Value = "value",
                   # height="550px",
                   # width="350px",
                   radiusCalculation = JS("Math.sqrt(d.nodesize)+6"),
                   linkDistance = 10,          # distance between node. Increase this value to have more space between nodes
                   charge = -900,              # numeric value indicating either the strength of the node repulsion (negative value) or attraction (positive value)
                   fontSize = 14,
                   opacity = 0.9,              # opacity of nodes. 0=transparent. 1=no transparency
                   linkWidth = JS("function(d) {return d.linkWidth;}+2"),
                   zoom = T,
                   opacityNoHover = TRUE,
                   clickAction = MyClickScript,
                   colourScale = JS('d3.scaleOrdinal().range(["salmon","red","orange"]);'))

net

3.7 Sankeys (ENCUESTA ORIGEN-DESTINO)

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

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

# Generamos un objeto para guardar los nodos: 
nodes <- data.frame(name =
                      c(as.character(datosankey$source), 
                        as.character(datosankey$target)) %>% 
                      unique() %>% sort()) 

# Generamos la columna IDSource (iniciando desde el cero)
datosankey$IDsource=match(datosankey$source, nodes$name)-1 
# Generamos la columna IDtarget (iniciando desde el cero)
datosankey$IDtarget=match(datosankey$target, nodes$name)-1
# Generamos la visualización: 
sankey = sankeyNetwork(Links = datosankey, Nodes = nodes,
              Source = "IDsource", Target = "IDtarget",
              Value = "value", NodeID = "name", 
              sinksRight=FALSE, nodeWidth=60,
              fontSize=10,
              nodePadding=8)

sankey

Grafica 08: Series de tiempo con dygraph (BITCOIN OTRA VEZ) —-

DOCUMENTACION: https://rstudio.github.io/dygraphs/

# Grafica 02: Líneas (BITCOIN)
bitcoin <- read_csv("Bases de datos/bitcoin.csv") %>% 
  mutate(Volume = as.numeric(Volume), 
         Close = as.numeric(Close)) %>% 
  filter(!is.na(Volume) | !is.na(Close)) %>% 
  mutate(popup = str_c("<b>Precio de Cierre:</b> $", 
                       prettyNum(Close, 
                                 big.mark = ","), "<br>", 
                       "<b>Fecha:</b> ", Date, "<br>",
                       "<b>Volumen de transacciones:</b> $",
                       prettyNum(Volume, big.mark = ",")))

# Generamos la serie de tiempo
ts_bitcoin <- xts(x = bitcoin$Close, 
    order.by = bitcoin$Date)
class(ts_bitcoin) # [1] "xts" "zoo"
## [1] "xts" "zoo"
# Función de JS 
valueFormatter<- 'function(d){return d.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ",");}'
# Generamos la gráfica: 
plt = dygraph(ts_bitcoin, 
        main = "Precio de Cierre de Bitcoin") %>% 
  dyAxis("y", label = "Close price in USD",
         axisLabelFormatter=JS(valueFormatter)) %>% 
  dyRangeSelector(dateWindow = c(bitcoin$Date[1], 
                                 bitcoin$Date[nrow(bitcoin)])) %>% 
  dySeries("V1", "Close Price ($USD)") %>% 
  dyOptions(stackedGraph = TRUE) %>%
  dyRangeSelector(height = 20) %>% 
  dyCrosshair(direction = "vertical")%>% 
  dyUnzoom()

plt