Visualización de datos más infrautilizada [cerrada]


178

Los histogramas y los diagramas de dispersión son excelentes métodos para visualizar datos y la relación entre variables, pero recientemente me he estado preguntando qué técnicas de visualización me estoy perdiendo. ¿Cuál crees que es el tipo de trama menos utilizado?

Las respuestas deberían:

  1. No se usa con mucha frecuencia en la práctica.
  2. Sea comprensible sin una gran discusión de fondo.
  3. Ser aplicable en muchas situaciones comunes.
  4. Incluya código reproducible para crear un ejemplo (preferiblemente en R). Una imagen vinculada estaría bien.

13
Creo que esta es una discusión muy útil, y estoy triste porque está cerrada.
Alex Brown

2
@AlexBrown: entonces, ¿por qué no votar para reabrir? Puedo ver por qué la redacción de esta pregunta puede parecer "no constructiva", pero esta pregunta resultó en algunas de las respuestas más reflexivas y perspicaces sobre este tema en cualquier parte de la web. Me encantaría ver estas respuestas actualizadas y extendidas.
max

2
Esto probablemente debería trasladarse a stats.stackoverflow.com. Es mucho más adecuado para ese sitio.
naught101

44
Lástima que nadie mencione las parcelas QQ aquí antes de que esto se cerrara. ¡Son muy útiles!
naught101

Esto debería volver a abrirse.
Peter Flom

Respuestas:


89

Realmente estoy de acuerdo con los otros carteles: los libros de Tufte son fantásticos y vale la pena leerlos.

Primero, te diría un tutorial muy bueno sobre ggplot2 y ggobi de "Looking at Data" a principios de este año. Más allá de eso, solo destacaría una visualización de R y dos paquetes de gráficos (que no son tan ampliamente utilizados como los gráficos base, la red o ggplot):

Mapas de calor

Realmente me gustan las visualizaciones que pueden manejar datos multivariados, especialmente datos de series temporales. Los mapas de calor pueden ser útiles para esto. Uno realmente genial fue presentado por David Smith en el blog Revolutions . Aquí está el código ggplot cortesía de Hadley:

stock <- "MSFT"
start.date <- "2006-01-12"
end.date <- Sys.Date()
quote <- paste("http://ichart.finance.yahoo.com/table.csv?s=",
                stock, "&a=", substr(start.date,6,7),
                "&b=", substr(start.date, 9, 10),
                "&c=", substr(start.date, 1,4), 
                "&d=", substr(end.date,6,7),
                "&e=", substr(end.date, 9, 10),
                "&f=", substr(end.date, 1,4),
                "&g=d&ignore=.csv", sep="")    
stock.data <- read.csv(quote, as.is=TRUE)
stock.data <- transform(stock.data,
  week = as.POSIXlt(Date)$yday %/% 7 + 1,
  wday = as.POSIXlt(Date)$wday,
  year = as.POSIXlt(Date)$year + 1900)

library(ggplot2)
ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + 
  geom_tile(colour = "white") + 
  scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + 
  facet_wrap(~ year, ncol = 1)

Lo que termina pareciéndose a esto:

texto alternativo

RGL: Gráficos 3D interactivos

Otro paquete que vale la pena aprender es RGL , que proporciona fácilmente la capacidad de crear gráficos 3D interactivos. Hay muchos ejemplos en línea para esto (incluso en la documentación de rgl).

R-Wiki tiene un buen ejemplo de cómo trazar diagramas de dispersión 3D usando rgl.

GGobi

Otro paquete que vale la pena conocer es rggobi . Hay un libro de Springer sobre el tema , y una gran cantidad de excelente documentación / ejemplos en línea, incluso en el curso "Mirar datos" .


bonito. Gracias por incluir el código / imagen.
Ian Fellows

¿Qué indica la posición vertical de la 'Z' o curva en cada línea vertical negra sólida?
doug

Esos son límites mensuales (los meses no terminan el mismo día).
Shane

3
Eso es hermoso. ¿Cómo conseguiste que pasaran los límites del mes?
Alex Brown


58

Realmente me gustan los dotplots y encuentro que cuando los recomiendo a otros por problemas de datos apropiados, siempre están sorprendidos y encantados. No parecen tener mucho uso, y no puedo entender por qué.

Aquí hay un ejemplo de Quick-R: dotplot en los datos del automóvil

Creo que Cleveland es el principal responsable del desarrollo y la promulgación de estos, y el ejemplo en su libro (en el que los datos defectuosos se detectaron fácilmente con un diagrama de puntos) es un argumento poderoso para su uso. Tenga en cuenta que el ejemplo anterior solo pone un punto por línea, mientras que su poder real viene con usted tiene múltiples puntos en cada línea, con una leyenda que explica cuál es cuál. Por ejemplo, puede usar diferentes símbolos o colores para tres puntos de tiempo diferentes, y de ahí obtener fácilmente una idea de los patrones de tiempo en diferentes categorías.

En el siguiente ejemplo (¡hecho en Excel de todas las cosas!), Puede ver claramente qué categoría podría haber sufrido un intercambio de etiquetas.

Gráfico de puntos con 2 grupos


1
¿En qué se diferencia un diagrama de puntos de un diagrama de dispersión con eje conmutado, uno de los cuales es categórico?
DrSAR

44
@DrSAR ¿En qué se diferencia un histograma de un gráfico de barras o un gráfico de densidad diferente de un gráfico de líneas? Puede describir muchos tipos de gráficos estándar en términos de geometrías más fundamentales (véase Semiologie Graphique de Bertin ), pero eso no hace que la idea de trazar algo de una manera particular sea menos única. En este caso, está trazando dos piezas de información categórica (una vertical, una por la forma del carácter de trazado) contra una pieza de datos continuos. Si bien en la mayoría de los paquetes de software piratearías un diagrama de dispersión para crearlo, lo más importante es que no es un diagrama de dispersión.
Ari B. Friedman

2
@ gsk3 No quise sonar sarcástico. De hecho, ahora (después de leer más sobre gramática de gráficos y trabajos similares) me doy cuenta de que esta distinción de nivel superior puede ser bastante importante para la presentación. Gracias por mostrar esto.
DrSAR

@DrSAR Y no quise sonar a la defensiva. La naturaleza de los comentarios SO, supongo ;-)
Ari B. Friedman

56

Las parcelas que usan coordenadas polares son ciertamente subutilizadas, algunos dirían con buena razón. Creo que las situaciones que justifican su uso no son comunes; También creo que cuando surgen esas situaciones, las gráficas polares pueden revelar patrones en los datos que las gráficas lineales no pueden.

Creo que es porque a veces sus datos son inherentemente polares en lugar de lineales, por ejemplo, son cíclicos (coordenadas x que representan tiempos durante un día de 24 horas durante varios días), o los datos se mapearon previamente en un espacio de características polares.

Aquí hay un ejemplo. Este gráfico muestra el volumen de tráfico medio de un sitio web por hora. Observe los dos picos a las 10 p.m. y a la 1 a.m. Para los ingenieros de red del Sitio, esos son importantes; También es significativo que ocurran uno cerca del otro (solo con dos horas de diferencia). Pero si traza los mismos datos en un sistema de coordenadas tradicional, este patrón estaría completamente oculto: trazados linealmente, estos dos picos estarían separados por 20 horas, lo que son, aunque también están separados por dos horas en días consecutivos. La tabla polar anterior muestra esto de una manera parsimoniosa e intuitiva (no es necesaria una leyenda).

Gráfico polar que muestra el tráfico del sitio, con picos en las horas 1 y 22

Hay dos formas (que yo sepa) de crear tramas como esta usando R (creé la trama anterior con R). Una es codificar su propia función en los sistemas gráficos base o de cuadrícula. La otra forma, que es más fácil, es usar el paquete circular . La función que usaría es ' rose.diag ':

data = c(35, 78, 34, 25, 21, 17, 22, 19, 25, 18, 25, 21, 16, 20, 26, 
                 19, 24, 18, 23, 25, 24, 25, 71, 27)
three_palettes = c(brewer.pal(12, "Set3"), brewer.pal(8, "Accent"), 
                   brewer.pal(9, "Set1"))
rose.diag(data, bins=24, main="Daily Site Traffic by Hour", col=three_palettes)

44
Al copiar su código, obtengo una trama muy diferente (que es bastante fea); alguna idea de por qué? Recibo esta advertencia: 1: en as.circular (xx [, 1]): un objeto se coacciona a la clase 'circular' usando el valor predeterminado para los siguientes componentes: tipo: unidades 'ángulos': plantilla 'radianes': ' ninguno 'módulo:' asis 'cero: 0 rotación:' contador 'rose.diagdata24Día del sitio diario por Hourthree_palettes
datayoda

Tengo el mismo problema.
crayola

También puedes hacer esto con un diagrama lineal. Puede ser un poco más difícil de leer, pero también puede ser realmente sorprendente para datos más granulares o datos que se someten a más de un ciclo (por ejemplo, trazar diez ciclos, luego trazar su promedio).
naught101

1
También tuve problemas para replicar la trama. Finalmente decidí que era más fácil usar ggplot2. He dejado una breve demostración en Rpubs con código y resultados: rpubs.com/mattbagg/circular
MattBagg

1
equivalente a ggplot2:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
naught101

54

Si su diagrama de dispersión tiene tantos puntos que se convierte en un desastre completo, pruebe con un diagrama de dispersión suavizado. Aquí hay un ejemplo:

library(mlbench) ## this package has a smiley function
n <- 1e5 ## number of points
p <- mlbench.smiley(n,sd1 = 0.4, sd2 = 0.4) ## make a smiley :-)
x <- p$x[,1]; y <- p$x[,2]
par(mfrow = c(1,2)) ## plot side by side
plot(x,y) ## left plot, regular scatter plot
smoothScatter(x,y) ## right plot, smoothed scatter plot

El hexbinpaquete (sugerido por @Dirk Eddelbuettel) se usa para el mismo propósito, pero smoothScatter()tiene la ventaja de que pertenece al graphicspaquete y, por lo tanto, es parte de la instalación estándar de R.

Smiley como diagrama de dispersión regular o suavizado


66
En aras de la integridad, también puede obtener este efecto en ggplot mediante el uso de la transparencia (alfa).), En combinación con el punto geom.
Paul Hiemstra

1
¿Es esto lo mismo que la estimación de densidad del núcleo, o simplemente similar?
endolito

30

Con respecto a sparkline y otras ideas de Tufte, el paquete YaleToolkit en CRAN proporciona funciones sparkliney sparklines.

Otro paquete que es útil para conjuntos de datos más grandes es hexbin, ya que ingeniosamente ' agrupa ' los datos en cubos para tratar con conjuntos de datos que pueden ser demasiado grandes para diagramas de dispersión ingenuos.


44
+1 a los minigráficos. Actualmente estoy trabajando en un paquete que se centra en la creación de minigráficos en R: hacen excelentes adiciones a las tablas en los informes de Sweave.
Sharpie

1
¡Frio! ¡No estoy muy contento con lo que Jay tiene en YaleToolkit y me encantaría tener minigráficos en las mesas!
Dirk Eddelbuettel

Acabo de documentar una forma de producir minigráficos solo usando plotuna actualización de mi pregunta , con algo de ayuda de esta publicación del foro de Tufte
Ben

1
La Hmisc::latex()versión de salida de Hmisc::describeincluye un mini histograma que se incluye en la tabla.
IRTFM

28

Las parcelas de violín (que combinan parcelas de caja con densidad de grano) son relativamente exóticas y bastante geniales. El paquete vioplot en R te permite hacerlos con bastante facilidad.

Aquí hay un ejemplo (el enlace de wikipedia también muestra un ejemplo):

ingrese la descripción de la imagen aquí


3
Las parcelas para violín también están disponibles a través del paquete de celosía:bwplot(... panel = panel.violin)
David J.

3
La versión ggplot2 de las tramas de violín llegará en breve. github.com/wch/ggplot2/wiki/geom_violin
Roman Luštrik

No creo que las parcelas de violín sean tan útiles, en su lugar me gusta mostrar todos los puntos con un jitter.
Nakx

25

Otra buena visualización de series de tiempo que estaba revisando es el "gráfico de relieve " (como aparece en esta publicación en el blog "Learning R" ). Esto es muy útil para visualizar cambios de posición a lo largo del tiempo.

Puede leer sobre cómo crearlo en http://learnr.wordpress.com/ , pero esto es lo que parece:

texto alternativo


Me gusta el gráfico de relieve para estos datos en particular, pero me resulta difícil pensar en situaciones más generales en las que sería útil. Dicho esto, creo que todos podemos estar de acuerdo en que el blog de Learning R es genial.
Ian Fellows

77
Un gráfico de relieve es un gráfico de coordenadas paralelas de datos clasificados.
hadley

1
Esto me recuerda a Slographgraph, que es bueno para representar el cambio de clasificación en el tiempo o las relaciones entre clasificaciones: charliepark.org/slopegraphs
topchef

21

También me gustan las modificaciones de Tufte de las gráficas de caja que le permiten hacer comparaciones de múltiplos pequeños mucho más fácilmente porque son muy "delgadas" horizontalmente y no saturan la trama con tinta redundante. Sin embargo, funciona mejor con un número bastante grande de categorías; Si solo tiene unos pocos en una parcela, las parcelas regulares (Tukey) se ven mejor ya que tienen un poco más de peso.

library(lattice)
library(taRifx)
compareplot(~weight | Diet * Time * Chick, 
  data.frame=cw , 
  main = "Chick Weights",
  box.show.mean=FALSE,
  box.show.whiskers=FALSE,
  box.show.box=FALSE
  )

compareplot

En esta pregunta se discuten otras formas de hacer esto (incluido el otro tipo de diagrama de caja de Tufte) .


@daroczig Gracias. Uno de estos días lo reescribiré para tomar diferentes configuraciones de agrupaciones. ¡Aprendí mucho desde que escribí esa función!
Ari B. Friedman

1
Me gustan mucho más tus argumentos que los de tufte, que son ridículamente difíciles de leer. Todavía creo que los diagramas de caja de estilo Tukey son mejores, aunque un buen compromiso podría ser algo como lo que tienes aquí, pero con líneas anchas de 3px para el cuadro, en lugar del desplazamiento de 1px. Y creo que una línea horizontal de 1px de ancho para la mediana es probablemente más ordenada y más exacta.
nada101

19

No debemos olvidarnos de la linda e históricamente importante trama de tallo y hojas (¡a Tufte también le encanta!). Obtiene una visión general directamente numérica de su densidad y forma de datos (por supuesto, si su conjunto de datos no es mayor que unos 200 puntos). En R, la función stemproduce su distribución de tallo y hoja (en el espacio de trabajo). Prefiero usar la gstemfunción del paquete fmsb para dibujarla directamente en un dispositivo gráfico. A continuación se muestra una variación de la temperatura corporal del castor (los datos deben estar en su conjunto de datos predeterminado) en una pantalla de tallo por hoja:

  require(fmsb)
  gstem(beaver1$temp)

ingrese la descripción de la imagen aquí



15

Además del excelente trabajo de Tufte, recomiendo los libros de William S. Cleveland: Visualizing Data y The Elements of Graphing Data . No solo son excelentes, sino que todos se hicieron en R, y creo que el código está disponible públicamente.


14

¡Diagramas de caja! Ejemplo de la ayuda R:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")

En mi opinión, es la forma más práctica de echar un vistazo rápido a los datos o comparar distribuciones. Para distribuciones más complejas hay una extensión llamada vioplot.



Los diagramas de caja no están tan subutilizados, ¿verdad? Quiero decir, seguro, en muchos documentos se utilizan gráficos de barras para los datos que se deben trazar, pero siguen siendo bastante comunes.
nada101

11

Las tramas de mosaico me parecen cumplir con los cuatro criterios mencionados. Hay ejemplos en r, bajo mosaicplot.


3
Una mejor implementación de los gráficos de mosaico se encuentra en la biblioteca vcd (nombre de función 'mosaico'). Tiene una firma de método mucho más flexible y se implementa en cuadrícula (en lugar del sistema de gráficos 'base').
Doug

10

Mira el trabajo de Edward Tufte y especialmente este libro

También puedes intentar atrapar su presentación itinerante . Es bastante bueno e incluye un paquete de cuatro de sus libros. (¡Juro que no soy dueño de las acciones de su editor!)

Por cierto, me gusta su técnica de visualización de datos de minigráfico. ¡Sorpresa! Google ya lo escribió y lo publicó en Google Code


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.