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(ggmosaic)
## Loading required package: ggplot2
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
  1. Barras e Histogramas

    Hay diversas funciones para generar gráficas, mapas y muchas representaciones más, pero en especifico add_bars() y add_histogram() forman barras (requiere altura de barra) e histogramas (Requieren una sola variable) en plotly.

library(plotly)
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

hace una comparación entre los algoritmos de binning predeterminados de Plotly con algoritmos disponibles en R por medio de hist(). Esta función permite hacer referencias 3 algoritmos famosos por su nombre (Sturges, Freedman y Diaconis). La price_hist() envuelve la función mencionada anteriormente para obtener resultados de la división en intervalos.

library(dplyr)
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

muestra la diferencia existente entre la implementación de cada gráfica a pesar de ser iguales. La add_histogram función permite enviar datos vistos del navegador y permite que Plotly.js realize las agrupaciones. En cambio, se necesita más tiempo para realizar el binning de R (tiene una ventaja y es de enviar menos datos y cálculos). En este caso, solo tenemos alrededor de 50K registros. Essta figura nos muestra el número de diamantes por corte.

5.1 Distribuciones numéricas múltiples

Suele ser útil ver cómo cambia una distribución de valores con respecto a una variable discreta. Al visualizar distribuciones numéricas múltiples usando gráficos de barras, recomiendo trazar cada distribución en su propio eje usando una pantalla de múltiplos pequeños, en lugar de tratar de ajustarlos en un eje. Observe cómo la función one_plot() define lo que se muestra en cada panel y luego usa una estrategia de división, aplicación y recombinación.

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). Podemos ver gracias diferentes, en donde los diamantes VS1 muestran una pequeña o varias inclusiones pequeñas que no son visibles a simple vista (eye-clean) y solo pueden ubicarse, a menudo con dificultad, utilizando una lupa de aumento 10x.Por otra parte, VVS2: Estos diamantes solo tendrían dos diminutas inclusiones y, de acuerdo con la clasificación VVS1, solo un microscopio identificaría las inclusiones. Sin embargo, los evaluadores expertos pueden ubicar una inclusión VVS2 utilizando una lupa de aumento de 10x, pero VVS2 aún ofrece un nivel muy alto de pureza y su precio es menos costoso que un VVS1.Asimismo, VVS1 es un diamante con un grado de pureza que tendría una pequeña inclusión que solo puede ubicarse utilizando un potente microscopio.

5.2 Distribuciones discretas múltiples

Visualizar muchas distribuciones discretas es difícil. Una complicación sutil se debe al hecho de que los números y las proporciones son importantes para comprender las distribuciones discretas multivariadas.

plot_ly(diamonds, x = ~cut, color = ~clarity) %>%
  add_histogram()

Figura 5.4

En el cual se observa el número de diamantes dividido por tamaño y claridad utilizando un gráfico de barras de grupo. Ademas, es útil comparar los recuentos de diamantes por claridad y corte. Por ejemplo, entre los diamantes “ideales”, el corte “VS1” es el más común, el “VS2” es el segundo más común y el corte “I1” es el menos común.

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

La figura 5.5

facilita esta comparación al mostrar la frecuencia relativa de los diamantes por claridad, dado un 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 <https://github.com/haleyjeppson/ggmosaic>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Este tipo de gráfico, también llamado gráfico de columnas, es un caso especial del gráfico cuadrado. Para parcelas cuadradas, puede escalar el ancho y el alto de las barras según una distribución discreta. La Figura 5.6 muestra el diseño de mosaico recortado para mayor claridad. Tenga en cuenta que el ancho de la barra es proporcional a la frecuencia de corte.

Referencias

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