Freddy MarmolejoPlotly ofrece dos funciones para mostrar contenedores rectangulares:
add_heatmap() y add_histogram2d(). Para datos
numéricos, se recomienda add_histogram2d() para la
exploración, ya que no requiere calcular los contenedores previamente.
Esta función también tiene atributos para ajustar el suavizado y el
número de contenedores en las direcciones x e/y. Además, se puede optar
por utilizar contornos rellenos en lugar de contenedores con
add_histogram2dcontour().
library(plotly)
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.2
##
## 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
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 el Capítulo 5, se utilizó R para calcular el
número “óptimo” de contenedores para un histograma en 2D. Aunque la
investigación en este ámbito es limitada, la estimación de densidad de
kernel en 2D proporciona una alternativa robusta. La función
kde2d() del paquete MASS ofrece una regla
práctica para estimar el ancho de banda de una densidad de kernel
gaussiana, y se utilizó para visualizar los resultados como un mapa de
calor en la figura generada a continuación:
kde_count <- function(x, y, ...) {
kde <- MASS::kde2d(x, y, ...)
df <- with(kde, setNames(expand.grid(x, y), c("x", "y")))
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 de plotly admiten ejes categóricos,
permitiendo la visualización de tablas de contingencia y matrices de
correlación. Se recomienda el uso de gráficos de barras agrupadas en
lugar de mapas de calor para comparaciones más fáciles. Sin embargo,
add_heatmap() sigue siendo útil para ejes categóricos al
permitir la visualización de cantidades a lo largo del eje z.
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))
Es interesante saber que, al incorporar un atributo z en plot_1y(), el software automáticamente representa puntos, líneas y trayectorias en tres dimensiones. Esto implica que podemos aplicar todas las técnicas que hemos aprendido en las Secciones 3.1 y 3.2 para crear gráficos en tres dimensiones.
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
add_markers(color = ~cyl)
Para crear una trayectoria en 3D, utiliza add_paths() de
la misma manera que se haría para una trayectoria en 2D, pero se agrega
una tercera variable z, tal como se muestra en la siguiente figura:
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
add_paths (color = ~displ)
En la siguiente figura se utiliza add_lines() en lugar
de add_paths() para asegurar que los puntos estén
conectados por el eje x en lugar del orden de las filas.
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
add_lines(color = ~displ)
Al igual que con las líneas no tridimensionales, puedes crear múltiples líneas especificando una variable de agrupación.
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
group_by (cyl) %>%
add_lines(color = ~displ)
En gráficos tridimensionales, es importante tener en cuenta que los
objetos de los ejes forman parte de la definición de la
escena, la cual a su vez está incluida en el
layout(). Esto significa que si deseas ajustar los títulos
de los ejes (por ejemplo, como se muestra en la siguiente figura) u
otros aspectos específicos de la definición de los ejes, como la
relación entre ellos (es decir, aspectratio”), o la configuración
predeterminada de la cámara (es decir, camera’), debes hacerlo a través
de la configuración de la escena.
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
add_lines(color = ~displ) %>%
layout (
scene = list(
xaxis = list(title = "MPG city"),
yaxis = list(title = "MPG highway"),
zaxis = list(title = "Number of cylinders")
)
)
Crear superficies en 3D utilizando add_surface() es
similar a la creación de mapas de calor con add_heatmap().
De hecho, es posible incluso generar superficies en 3D sobre ejes x/y
categóricos. Sin embargo, es importante asegurar un orden lógico en los
ejes x/y en un gráfico de superficie, ya que plotly.js
interpola los valores z. Por lo general, la superficie en 3D representa
una región continua, como se ilustra en la figura generada a
continuación para mostrar la altura de un volcán. Si se proporciona una
matriz numérica a z como se muestra en la figura, los atributos x e y no
son obligatorios, pero si se proporcionan, la longitud de x debe
coincidir con el número de columnas en la matriz, mientras que la
longitud de y debe coincidir con el número de filas.
x <- seq_len(nrow(volcano)) + 100
y <- seq_len(ncol(volcano)) + 500
plot_ly() %>% add_surface(x = ~x, y = ~y, z = ~volcano)