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"]);'))
net3.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)
sankeyGrafica 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