library(ggplot2)
library(plotly)
##
## 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(ggforce)
library(remotes)
library(graphics)
library(htmltools)
library(ggmosaic)
El paquete de gráficos tiene dos funciones para mostrar intervalos rectangulares: add_heatmap() y add_histogram2d(). Para datos numéricos, la función add_heatmap() es el análogo 2D de add_bars() (los intervalos deben calcularse previamente), y la función add_histogram2d() es el análogo 2D de add_histogram() (los intervalos se pueden calcular en el navegador). Entonces, para fines de investigación, recomiendo usar add_histogram2d() porque no tiene que pensar en cómo se realiza el agrupamiento. También proporciona una propiedad zsmooth útil para aumentar de manera eficiente la cantidad de contenedores (actualmente la interpolación bilineal con mejor rendimiento, el algoritmo del vecino más cercano) y las propiedades nbinsx/nbinsy para establecer la cantidad de contenedores en las direcciones x y/o. y. 7.1. La figura compara tres usos diferentes de add_histogram(): (1) algoritmo de binning predeterminado en plotly.js, (2) alineación predeterminada, (3) establecer el número de bins en las direcciones x e y. También vale la pena señalar que en ambos casos puede usar contornos rellenos en lugar de contenedores usando add_histogram2dcontour() en lugar de add_histogram2d().
p <- plot_ly(diamonds, x = ~log(carat), y = ~log(price))
subplot(
add_histogram2d(p) %>%
colorbar(title = "default") %>%
layout(xaxis = list(title = "default")),
add_histogram2d(p, zsmooth = "best") %>%
colorbar(title = "zsmooth") %>%
layout(xaxis = list(title = "zsmooth")),
add_histogram2d(p, nbinsx = 60, nbinsy = 60) %>%
colorbar(title = "nbins") %>%
layout(xaxis = list(title = "nbins")),
shareY = TRUE, titleX = TRUE
)
En Bars & histograms, aprovechamos una serie de algoritmos en R para calcular el número “óptimo” de intervalos para un histograma, a través de hist(), y dirigir esos resultados a add_bars(). Hay una sorprendente falta de investigación y herramientas computacionales para el análogo 2D, y entre la investigación que existe, las soluciones suelen depender de las características de la distribución subyacente desconocida, por lo que el enfoque típico es asumir una forma gaussiana (Scott 1992). En la práctica, esa suposición no es muy útil, pero la estimación de la densidad del kernel 2D proporciona una alternativa útil que tiende a ser más robusta a los cambios en la forma de distribución. Aunque la estimación de la densidad del kernel requiere la elección del kernel y de un parámetro de ancho de banda, la función kde2d() del paquete MASS proporciona una regla práctica para estimar el ancho de banda de una densidad kernel gaussiana (Venables y Ripley 2002). La figura 7.2 utiliza kde2d() para estimar una densidad 2D, escala la frecuencia relativa a una frecuencia absoluta y, a continuación, utiliza la función add_heatmap() para mostrar los resultados como un mapa de calor.
kde_count <- function(x, y, ...) {
kde <- MASS::kde2d(x, y, ...)
df <- with(kde, setNames(expand.grid(x, y), c("x", "y")))
# The 'z' returned by kde2d() is a proportion,
# but we can scale it to a count
df$count <- with(kde, c(z) * length(x) * diff(x)[1] * diff(y)[1])
data.frame(df)
}
kd <- with(diamonds, kde_count(log(carat), log(price), n = 30))
plot_ly(kd, x = ~x, y = ~y, z = ~count) %>%
add_heatmap() %>%
colorbar(title = "Number of diamonds")
Las funciones add_histogram2d(), add_histogram2dcontour() y add_heatmap() admiten ejes categóricos. Así, add_histogram2d() puede utilizarse para mostrar fácilmente tablas de contingencia de 2 vías, pero como es más fácil comparar valores a lo largo de una escala común que comparar colores (Cleveland y McGill 1984), recomiendo crear gráficos de barras agrupadas en su lugar. Sin embargo, la función add_heatmap() puede seguir siendo útil para los ejes categóricos, ya que nos permite mostrar cualquier cantidad que queramos a lo largo del eje z (color).
La figura 7.3 utiliza add_heatmap() para mostrar una matriz de correlación. Observe cómo los argumentos limits de la función colorbar() pueden utilizarse para expandir los límites de la escala de colores para reflejar el rango de correlaciones posibles (algo que no es fácil de hacer en plotly.js).
corr <- cor(dplyr::select_if(diamonds, is.numeric))
plot_ly(colors = "RdBu") %>%
add_heatmap(x = rownames(corr), y = colnames(corr), z = corr) %>%
colorbar(limits = c(-1, 1))
Cleveland, William S, and Robert McGill. 1984. “Graphical Perception: Theory, Experimentation, and Application to the Development of Graphical Methods.” Journal of the American Statistical Association 79 (September): 531–54.
Scott, David W. 1992. Multivariate Density Estimation: Theory, Practice, and Visualization. Wiley & Sons.
Venables, W. N., and B. D. Ripley. 2002. Modern Applied Statistics with S. Fourth. New York: Springer. http://www.stats.ox.ac.uk/pub/MASS4.