scatterplotmatrix - R: Scatterplot con demasiados puntos
scatterplot r (6)
Estoy tratando de trazar dos variables donde N = 700K. El problema es que hay demasiada superposición, por lo que la trama 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 trama 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 trama sea una "nube", mientras más puntos haya en una región, más oscura será esa región.
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"))
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)
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()
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")
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)
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)
O otro enfoque sería usar smoothScatter()
:
smoothScatter(dat[2:3])
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'')
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)
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()
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()