graphics - library - scatter plot graph r
La visualización de datos más infrautilizada (15)
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 faltan. ¿Cuál crees que es el tipo de trama más infrautilizado?
Las respuestas deberían:
- No se usa muy comúnmente en la práctica.
- Ser comprensible sin una gran cantidad de discusión de fondo.
- Ser aplicable en muchas situaciones comunes.
- Incluye código reproducible para crear un ejemplo (preferiblemente en R). Una imagen vinculada sería agradable.
¡Boxplots! 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 rápido vistazo a los datos o comparar distribuciones. Para distribuciones más complejas hay una extensión llamada vioplot
.
Además del excelente trabajo de Tufte, recomiendo los libros de William S. Cleveland: Visualización de datos y Elementos de gráficos . No solo son excelentes, sino que fueron hechos en R, y creo que el código está disponible públicamente.
En cuanto a sparkline y otra idea de Tufte, el paquete YaleToolkit en CRAN proporciona funciones sparkline
y sparklines
.
Otro paquete que es útil para conjuntos de datos más grandes es hexbin ya que inteligentemente '' hexbin '' datos en cubos para tratar con conjuntos de datos que pueden ser demasiado grandes para diagramas de dispersión ingenuos.
Estoy realmente de acuerdo con los otros carteles: los libros de Tufte son fantásticos y vale la pena leerlos.
Primero, te indicaría un buen tutorial 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 gráficos base, celosía o ggplot):
Mapas de calor
Me gustan mucho las visualizaciones que pueden manejar datos multivariantes, especialmente datos de series de tiempo. Los mapas de calor pueden ser útiles para esto. Uno realmente bueno fue presentado por David Smith en el blog Revolutions . Aquí está el código de 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)
Que termina pareciéndose algo así:
RGL: gráficos 3D interactivos
Otro paquete que bien 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).
El R-Wiki tiene un buen ejemplo de cómo trazar gráficos de dispersión en 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 documentación / ejemplos excelentes en línea, incluido el curso "Mirando datos" .
Las parcelas de mosaico me parecen cumplir con los cuatro criterios mencionados. Hay ejemplos en r, bajo mosaicplot.
Las parcelas que usan coordenadas polares ciertamente no se utilizan bien, algunos dirían que con razón. Creo que las situaciones que justifican su uso no son comunes; También creo que cuando surgen esas situaciones, las tramas polares pueden revelar patrones en los datos que las tramas lineales no pueden.
Creo que es porque a veces sus datos son intrínsecamente polares en lugar de lineales, por ejemplo, son cíclicos (las coordenadas x representan tiempos durante días de 24 horas durante varios días), o los datos fueron previamente asignados a un espacio de características polares.
Aquí hay un ejemplo. Este gráfico muestra el volumen medio de tráfico del sitio web por hora. Observe los dos picos a las 10 p.m. ya la 1 a.m. Para los ingenieros de red del sitio, esos son significativos; también es significativo que ocurran cerca el uno del otro (solo dos horas de diferencia). Pero si trazas los mismos datos en un sistema de coordenadas tradicional, este patrón estaría completamente oculto: trazado linealmente, estos dos picos estarían separados por 20 horas, que son, aunque también están separadas por dos horas en días consecutivos. El cuadro polar anterior muestra esto de una manera parsimoniosa e intuitiva (una leyenda no es necesaria).
Hay dos formas (que yo conozco) para crear tramas como esta usando R (Creé el gráfico anterior w / R). Una es codificar su propia función en los sistemas gráficos de la base o la cuadrícula. Por otro lado, lo que es más fácil, es usar el paquete circular . La función que usarías 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)
Mira el trabajo de Edward Tufte y especialmente este libro
También puedes probar y atrapar su presentación itinerante . Es bastante bueno e incluye un paquete de cuatro de sus libros. (¡Juro que no soy el dueño de las acciones de su editor!)
Por cierto, me gusta su técnica de visualización de datos de sparkline. ¡Sorpresa! Google ya lo escribió y lo publicó en Google Code
No debemos olvidarnos de la trama de tallo y hojas linda e (históricamente) importante (¡que Tufte también ama!). Obtendrá una vista general numérica directa de su densidad y forma de datos (por supuesto, si su conjunto de datos no es mayor que unos 200 puntos). En R, el stem
la función produce la dislocación del tallo y la hoja (en el espacio de trabajo). Prefiero usar la función gstem
del paquete fmsb para dibujarla directamente en un dispositivo gráfico. A continuación se muestra la varianza de la temperatura corporal del castor (los datos deben estar en su conjunto de datos predeterminado) en una visualización de tallo por hoja:
require(fmsb)
gstem(beaver1$temp)
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 los cambios de posición en el tiempo.
Puede leer sobre cómo crearlo en http://learnr.wordpress.com/ , pero así es como se ve:
Parcelas de resumen? Como se menciona en esta página:
Realmente me gustan las dotplots y encuentro que cuando los recomiendo a otros para los problemas de datos apropiados, están invariablemente sorprendidos y encantados. No parecen tener mucho uso, y no puedo entender por qué.
Aquí hay un ejemplo de Quick-R:
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 una gráfica de puntos) es un poderoso argumento para su uso. Tenga en cuenta que el ejemplo anterior solo muestra un punto por línea, mientras que su poder real viene con usted tiene puntos múltiples en cada línea, con una leyenda que explica cuál es cuál. Por ejemplo, podría usar diferentes símbolos o colores para tres puntos de tiempo diferentes, y de allí obtener fácilmente una sensación de 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 cambio de etiqueta.
Si su diagrama de dispersión tiene tantos puntos que se convierte en un completo desastre, intente 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 paquete hexbin
(sugerido por @Dirk Eddelbuettel) se usa para el mismo propósito, pero smoothScatter()
tiene la ventaja de que pertenece al paquete de graphics
y, por lo tanto, forma parte de la instalación R estándar.
También me gustan las modificaciones de Tufte de los diagramas de caja que te permiten hacer comparaciones de pequeños múltiplos mucho más fácilmente porque son muy "delgadas" horizontalmente y no saturan la trama con tinta redundante. Sin embargo, funciona mejor con una cantidad bastante grande de categorías; si solo tienes unos cuantos en una trama, los gráficos de caja regulares (Tukey) se ven mejor ya que tienen un poco más de peso para ellos.
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
)
Se discuten otras formas de hacer esto (incluido el otro tipo de diagrama de caja de Tufte) en esta pregunta .
Las parcelas de violín (que combinan diagramas 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):
Gráficos horizontales (pdf), para visualizar muchas series de tiempo a la vez.
Parcelas de coordenadas paralelas (pdf), para análisis multivariante.
Association y mosaic para visualizar tablas de contingencia (ver el paquete vcd )