Scatterplot con demasiados puntos

Estoy tratando de trazar dos variables donde N = 700K. El problema es que hay demasiada superposición, por lo que la ttwig se convierte principalmente en un bloque sólido de negro. ¿Hay alguna forma de tener una “nube” en escala de grises donde la oscuridad de la ttwig es una función del número de puntos en una región? En otras palabras, en lugar de mostrar puntos individuales, quiero que la ttwig sea una “nube”, mientras más puntos haya en una región, más oscura será esa región.

Una forma de lidiar con esto es con la mezcla alfa, que hace que cada punto sea ligeramente transparente. Por lo tanto, las regiones aparecen más oscuras y tienen más puntos graficados.

Esto es fácil de hacer en ggplot2 :

 df < - data.frame(x = rnorm(5000),y=rnorm(5000)) ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3) 

enter image description here

Otra forma conveniente de tratar con esto es (y probablemente más apropiado para la cantidad de puntos que tiene) es el agrupamiento hexagonal:

 ggplot(df,aes(x=x,y=y)) + stat_binhex() 

enter image description here

Y también hay un agrupamiento rectangular normal y antiguo (imagen omitida), que se parece más a su mapa de calor tradicional:

 ggplot(df,aes(x=x,y=y)) + geom_bin2d() 

También puedes echarle un vistazo al paquete ggsubplot . Este paquete implementa características que fueron presentadas por Hadley Wickham en 2011 ( http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html ).

(A continuación, incluyo la capa de “puntos” para fines ilustrativos).

 library(ggplot2) library(ggsubplot) # Make up some data set.seed(955) dat < - data.frame(cond = rep(c("A", "B"), each=5000), xvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)), yvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5))) # Scatterplot with subplots (simple) ggplot(dat, aes(x=xvar, y=yvar)) + geom_point(shape=1) + geom_subplot2d(aes(xvar, yvar, subplot = geom_bar(aes(rep("dummy", length(xvar)), ..count..))), bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE) 

enter image description here

Sin embargo, esto presenta rocas si tiene una tercera variable para controlar.

 # Scatterplot with subplots (including a third variable) ggplot(dat, aes(x=xvar, y=yvar)) + geom_point(shape=1, aes(color = factor(cond))) + geom_subplot2d(aes(xvar, yvar, subplot = geom_bar(aes(cond, ..count.., fill = cond))), bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE) 

enter image description here

O otro enfoque sería usar smoothScatter() :

 smoothScatter(dat[2:3]) 

enter image description here

La mezcla Alpha también es fácil de hacer con gráficos base.

 df < - data.frame(x = rnorm(5000),y=rnorm(5000)) with(df, plot(x, y, col="#00000033")) 

Los primeros seis números después del # son el color en RGB hexadecimal y los dos últimos son la opacidad, de nuevo en hexadecimal, por lo que 33 ~ 3 / 16o opaco.

enter image description here

También puede usar líneas de contorno de densidad ( ggplot2 ):

 df < - data.frame(x = rnorm(15000),y=rnorm(15000)) ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d() 

enter image description here

O combine contornos de densidad con mezcla alfa:

 ggplot(df,aes(x=x,y=y)) + geom_point(colour="blue", alpha=0.2) + geom_density2d(colour="black") 

enter image description here

Puede encontrarle útil el paquete hexbin . Desde la página de ayuda de hexbinplot :

 library(hexbin) mixdata < - data.frame(x = c(rnorm(5000),rnorm(5000,4,1.5)), y = c(rnorm(5000),rnorm(5000,2,3)), a = gl(2, 5000)) hexbinplot(y ~ x | a, mixdata) 

hexbinplot

Una descripción general de varias buenas opciones en ggplot2 :

 library(ggplot2) x < - rnorm(n = 10000) y <- rnorm(n = 10000, sd=2) + x df <- data.frame(x, y) 

Opción A: puntos transparentes

 o1 < - ggplot(df, aes(x, y)) + geom_point(alpha = 0.05) 

Opción B: agregar contornos de densidad

 o2 < - ggplot(df, aes(x, y)) + geom_point(alpha = 0.05) + geom_density_2d() 

Opción C: agregar contornos de densidad rellenos

 o3 < - ggplot(df, aes(x, y)) + stat_density_2d(aes(fill = ..level..), geom = 'polygon') + scale_fill_viridis_c(name = "density") + geom_point(shape = '.') 

Opción D: mapa de calor de densidad

 o4 < - ggplot(df, aes(x, y)) + stat_density_2d(aes(fill = ..density..), geom = 'raster', contour = FALSE) + scale_fill_viridis_c() + coord_cartesian(expand = FALSE) + geom_point(shape = '.', col = 'white') 

Opción E: hexbins

 o5 < - ggplot(df, aes(x, y)) + geom_hex() + scale_fill_viridis_c() + geom_point(shape = '.', col = 'white') 

Opción F: alfombras

 o6 < - ggplot(df, aes(x, y)) + geom_point(alpha = 0.1) + geom_rug(alpha = 0.01) 

Combine en una figura:

 cowplot::plot_grid(o1, o2, o3, o4, o5, o6, ncol = 2, labels = 'AUTO', align = 'v', axis = 'lr') 

enter image description here