Resumen y replica de capitulos 7 y 8 por: Freddy Marmolejo


Capitulo 7: Frecuencias 2D


7.1: Rectangular binning en plotly.js


Plotly 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
)

7.2: Rectangular binning en R


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")

7.3 Ejes categoricos


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)) 

Capitulo 8: Gráficos 3D


8.1 Marcadores


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) 

8.2 Trayectorías


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)

8.3 Líneas


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)

8.4 Ejes


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")
    )
  )

8.5 Superficies


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)