#Importar librerias
library(plotly)
## Warning: package 'plotly' was built under R version 4.2.3
## Loading required package: ggplot2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(ggplot2)
library(ggmosaic)
## Warning: package 'ggmosaic' was built under R version 4.2.3
La función add_bars() y add_histogram() son funciones de trazado en plotly.js para crear gráficos de barras e histogramas, respectivamente. La diferencia principal entre ambos es que los trazos de barra requieren alturas de barra (tanto en x como en y), mientras que los trazos de histograma solo requieren una variable y el agrupamiento se maneja en el navegador. Ambas funciones se pueden utilizar para visualizar la distribución de una variable numérica o discreta, con la única diferencia siendo dónde ocurre el agrupamiento.
La figura 5.1 comparaentre los algoritmos de binning predeterminados en plotly.js y algunos algoritmos diferentes disponibles en R a través de la función hist(). Mientras que plotly.js permite la personalización de los intervalos de histograma a través de xbins/ybins, R tiene diversas funciones para estimar el número óptimo de intervalos en un histograma que se pueden aprovechar fácilmente. La función hist() por sí sola nos permite hacer referencia a 3 algoritmos famosos por su nombre, pero también hay paquetes que amplían esta interfaz para incorporar más metodología. Se presenta la función price_hist() que envuelve la función hist() para obtener los resultados de la división en intervalos y asigna esos intervalos a una versión gráfica del histograma usando add_bars().
p1 <- plot_ly(diamonds, x = ~price) %>%
add_histogram(name = "plotly.js")
price_hist <- function(method = "FD") {
h <- hist(diamonds$price, breaks = method, plot = FALSE)
plot_ly(x = h$mids, y = h$counts) %>% add_bars(name = method)
}
subplot(
p1, price_hist(), price_hist("Sturges"), price_hist("Scott"),
nrows = 4, shareX = TRUE
)
FIGURA 5.1: el algoritmo de binning predeterminado de plotly.js versus el hist()predeterminado de R.
La Figura 5.2 muestra dos formas de crear un gráfico de barras básico. Una forma es mediante el uso de la función add_histogram(), la cual envía todos los valores observados al navegador y permite que plotly.js realice el agrupamiento. La otra forma está haciendo el binning en R y asignando los intervalos a una versión gráfica del histograma utilizando la función add_bars(). Aunque los resultados visuales son los mismos, hacer el binning en R tiene la ventaja de enviar menos datos y requiere menos trabajo de cálculo del navegador web. Con grandes cantidades de registros, esto puede reducir significativamente el tiempo de carga de la página y el tamaño de la página.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
p1 <- plot_ly(diamonds, x = ~cut) %>%
add_histogram()
p2 <- diamonds %>%
count(cut) %>%
plot_ly(x = ~cut, y = ~n) %>%
add_bars()
subplot(p1, p2) %>% hide_legend()
FIGURA 5.2: Número de diamantes por corte.
Se recomienda trazar cada distribución en su propio eje utilizando una pantalla de múltiplos pequeños en lugar de superponerlos en un solo eje al visualizar distribuciones numéricas múltiples en barras.
one_plot <- function(d) {
plot_ly(d, x = ~price) %>%
add_annotations(
~unique(clarity), x = 0.5, y = 1,
xref = "paper", yref = "paper", showarrow = FALSE
)
}
diamonds %>%
split(.$clarity) %>%
lapply(one_plot) %>%
subplot(nrows = 2, shareX = TRUE, titleX = FALSE) %>%
hide_legend()
## No trace type specified:
## Based on info supplied, a 'histogram' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#histogram
## No trace type specified:
## Based on info supplied, a 'histogram' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#histogram
## No trace type specified:
## Based on info supplied, a 'histogram' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#histogram
## No trace type specified:
## Based on info supplied, a 'histogram' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#histogram
## No trace type specified:
## Based on info supplied, a 'histogram' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#histogram
## No trace type specified:
## Based on info supplied, a 'histogram' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#histogram
## No trace type specified:
## Based on info supplied, a 'histogram' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#histogram
## No trace type specified:
## Based on info supplied, a 'histogram' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#histogram
FIGURA 5.3: Una visualización enrejada del precio del diamante por claridad del diamante.
Visualizar múltiples distribuciones discretas es difícil ya que tanto los recuentos como las proporciones son importantes para comprender las distribuciones discretas multivariadas. En la Figura 5.4 se presentan los recuentos de diamantes, divididos tanto por su corte como por su claridad, utilizando un gráfico de barras agrupadas. Este gráfico muestra cómo afecta la claridad la cantidad de diamantes en cada corte, y cómo influye la combinación de corte y la claridad en la cantidad de diamantes en cada categoría.
plot_ly(diamonds, x = ~cut, color = ~clarity) %>%
add_histogram()
FIGURA 5.4: Un gráfico de barras agrupadas de conteos de diamantes por corte y claridad.
La figura 5.4 que muestra los recuentos brutos, esta figura utiliza porcentajes para representar la distribución de los diamantes. En contraste la figura 5.5 muestra la frecuencia relativa de los diamantes por claridad, dado un corte, lo que facilita la comparación de las distribuciones de claridad en diferentes tipos de cortes y también utiliza un gráfico de barras agrupadas, pero la altura de cada barra representa la proporción de diamantes en el lugar del recuento.
# number of diamonds by cut and clarity (n)
cc <- count(diamonds, cut, clarity)
# number of diamonds by cut (nn)
cc2 <- left_join(cc, count(cc, cut, wt = n, name = 'nn'))
## Joining with `by = join_by(cut)`
cc2 %>%
mutate(prop = n / nn) %>%
plot_ly(x = ~cut, y = ~prop, color = ~clarity) %>%
add_bars() %>%
layout(barmode = "stack")
FIGURA 5.5: Gráfico de barras apiladas que muestra la proporción de claridad del diamante dentro del corte.
En un gráfico de mosaico, se pueden escalar tanto el ancho como la altura de las barras de acuerdo con distribuciones discretas. El paquete ggmosaic implementa un geom ggplot2 personalizado diseñado para parcelas de mosaico y puede convertirse en plotly a través de ggplotly(). La figura 5.6 muestra un diagrama de mosaico de corte por claridad, en el que los anchos de las barras se escalan proporcionalmente a la frecuencia de corte.
library(ggmosaic)
p <- ggplot(data = cc) +
geom_mosaic(aes(weight = n, x = product(cut), fill = clarity))
ggplotly(p)
## Warning: `unite_()` was deprecated in tidyr 1.2.0.
## ℹ Please use `unite()` instead.
## ℹ The deprecated feature was likely used in the ggmosaic package.
## Please report the issue at <]8;;https://github.com/haleyjeppson/ggmosaichttps://github.com/haleyjeppson/ggmosaic]8;;>.
FIGURA 5.6: Uso de ggmosaic y ggplotly()para crear visualizaciones interactivas avanzadas de datos categóricos.
Freedman, D. y P. Diaconis. 1981. “Sobre el histograma como estimador de densidad: teoría L2”. Zeitschrift Für Wahrscheinlichkeitstheorie Und Verwandte Gebiete 57: 453–76.
Jeppson, Haley, Heike Hofmann y Di Cook. 2016. Ggmosaic: Gráficos de mosaico en el marco ‘Ggplot2’ . http://github.com/haleyjeppson/ggmosaic .
Mildenberger, Thoralf, Yves Rozenholc y David Zasada. 2009. Histograma: Construcción de Histogramas Regulares e Irregulares con Diferentes Opciones para Selección Automática de Bins . https://CRAN.R-project.org/package=histogram .
Scott, David W. 1979. “Sobre histogramas óptimos y basados en datos”. Biometrika 66: 605–10.
Sturges, Herbert A. 1926. “La elección de un intervalo de clase”. Revista de la Asociación Estadounidense de Estadística 21 (153): 65–66. https://doi.org/10.1080/01621459.1926.10502161 .