Sección 6: Diagramas de caja

Los diagramas de caja codifican el resumen de cinco números de una variable numérica y proporcionan una forma decente forma de comparar muchas distribuciones numéricas. La tarea visual de comparar múltiples diagramas de caja es relativamente fácil en comparación con algunas alternativas comunes, pero la gráfica de caja a veces es inadecuada para capturar distribuciones complejas. La función add_boxplot() requiere una variable numérica y garantiza que los diagramas de caja estén orientados correctamente, independientemente de si la variable numérica se coloca en la escala x o y. Como muestra la siguiente gráfica, en el eje ortogonal al eje numérico, puede proporcionar una variable discreta (para el acondicionamiento) o proporcionar un solo valor (para nombrar la categoría del eje).

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
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
p <- plot_ly(diamonds, y = ~price, color = I("black"), 
             alpha = 0.1, boxpoints = "suspectedoutliers")
p1 <- p %>% add_boxplot(x = "Overall")
p2 <- p %>% add_boxplot(x = ~cut)
subplot(
  p1, p2, shareY = TRUE,
  widths = c(0.2, 0.8), margin = 0
) %>% hide_legend()

Si se desea particionar por más de una variable discreta, es posible usar la interacción de esas variables con el eje discreto y la coloración con la variable anidada, como se realiza en la siguiente gráfica con la claridad y el corte del diamante.

plot_ly(diamonds, x = ~price, y = ~interaction(clarity, cut)) %>%
  add_boxplot(color = ~clarity) %>%
  layout(yaxis = list(title = ""))

También es de gran utilidad organizar los diagramas de caja de acuerdo con algo significativo, como el precio medio. La siguiente figura presenta la misma información anterior, pero ordena los diagramas de caja por su mediana y deja inmediatamente claro que los diamantes con un corte de “SI2” tienen el precio de diamante más alto, en promedio.

d <- diamonds %>%
  mutate(cc = interaction(clarity, cut))

# interaction levels sorted by median price
lvls <- d %>%
  group_by(cc) %>%
  summarise(m = median(price)) %>%
  arrange(m) %>%
  pull(cc)

plot_ly(d, x = ~price, y = ~factor(cc, lvls)) %>%
  add_boxplot(color = ~clarity) %>%
  layout(yaxis = list(title = ""))

Sección 7: Frecuencias en 2D

Binning rectangular en plotly.js

El paquete plotly proporciona dos funciones para mostrar contenedores rectangulares. Una para datos numéricos, la función es un análogo 2D en el que las cajas deben estar precalculadas, y la función es un análogo 2D en el que las cajas se pueden calcular en el navegador. Por lo que, se recomienda con fines exploratorios, ya que no tiene que pensar en cómo realizar el binning.

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
)

Agrupación rectangular en R

Existe una sorprendente carencia de investigación y herramientas computacionales para el análogo 2D, y entre las investigaciones que existen, las soluciones generalmente dependen de las características de la distribución subyacente desconocida, por lo que el enfoque típico es asumir una forma gaussiana. En términos prácticos, 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 núcleo requiere la elección del núcleo y un parámetro de ancho de banda, la función del paquete MASS proporciona una regla empírica bien soportada para estimar el ancho de banda de una densidad de núcleo gaussiana. A continuación, se crea una gráfica que se utiliza para estimar una densidad 2D, escala la frecuencia relativa a una frecuencia absoluta y luego usa la función 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")

Ejes categóricos

Las funciones , y todos admiten ejes categóricos. Por lo que, se puede utilizar para mostrar fácilmente tablas de contingencia de 2 vías, pero dado que es más fácil comparar valores a lo largo de una escala común en lugar de comparar colores.

A continuación se expondrá un ejemplo utilizado para mostrar una matriz de correlación. Observe cómo los argumentos de la función se pueden usar para expandir los límites de la escala de color para reflejar el rango de posibles correlaciones.

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

Sección 8: Gráficos 3D

Marcadores

Simplemente agregando un atributo se sabrá cómo representar marcadores, líneas y rutas en tres dimensiones; lo que significa que todas las técnicas que fueron aprendidas anteriormente.

plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
  add_markers(color = ~cyl)

Rutas

Para realizar un trazado en 3D, se hace de la misma manera que con uno en 2D, pero hay que agregar una tercera variable, como se muestra aquí.

plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
  add_paths(color = ~displ)

Líneas

Se utiliza el siguiente código para garantizar que los puntos se encuentren 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)

De igual forma que con las líneas que no son 3D, es posible crear varias líneas si se especifica una variable de agrupación.

plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
  group_by(cyl) %>%
  add_lines(color = ~displ)

Ejes del gráfico

Para gráficos 3D, se necesita tener en cuenta que los objetos de ejes son parte de la definición de la escena, que es parte del diseño() de la escena. Es decir, si desea establecer un título de eje o algo más específico para la definición del eje, la relación del eje o el valor predeterminado de la cámara.

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

Superficies

Crear superficies 3D con es muy parecido a crear mapas de calor con . Debería haber un orden sensato para los ejes x / y en un diagrama de superficie ya que la gráfica interpola .js valores z. Por lo general, la superficie 3D está sobre una región continua, como se hizo anteriormente para mostrar la altura de un volcán. Si se proporciona una matriz numérica a z, no es necesario proporcionar los atributos x e y, pero si lo son, la longitud de x debe coincidir con el número de columnas de la matriz e 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)