Scatterplot com muitos pontos

Eu estou tentando plotar duas variables ​​onde N = 700K. O problema é que há muita sobreposição, de modo que o enredo se torna principalmente um bloco sólido de preto. Existe alguma maneira de ter uma “nuvem” em tons de cinza onde a escuridão do enredo é uma function do número de pontos em uma região? Em outras palavras, em vez de mostrar pontos individuais, quero que o enredo seja uma “nuvem”, com o maior número de pontos em uma região, mais escura essa região.

Uma maneira de lidar com isso é com a mistura alfa, o que torna cada ponto um pouco transparente. Então, as regiões parecem mais escuras que têm mais pontos plotados nelas.

Isso é fácil de fazer no ggplot2 :

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

insira a descrição da imagem aqui

Outra maneira conveniente de lidar com isso é (e provavelmente mais apropriada para o número de pontos que você tem) é a categorização hexagonal:

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

insira a descrição da imagem aqui

E há também o escaneamento retangular antigo regular (imagem omitida), que é mais parecido com o mapa de calor tradicional:

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

Você também pode dar uma olhada no pacote ggsubplot . Este pacote implementa resources que foram apresentados por Hadley Wickham em 2011 ( http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html ).

(A seguir, incluo a camada “pontos” para fins de ilustração).

 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) 

insira a descrição da imagem aqui

No entanto, isso apresenta rochas se você tiver uma terceira variável a ser controlada.

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

insira a descrição da imagem aqui

Ou outra abordagem seria usar smoothScatter() :

 smoothScatter(dat[2:3]) 

insira a descrição da imagem aqui

Mistura alfa é fácil de fazer com charts de base também.

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

Os primeiros seis números após o # são a cor em hexadecimal RGB e os dois últimos são a opacidade, novamente em hexadecimal, portanto, 33 ~ 3 / 16th opaco.

insira a descrição da imagem aqui

Você também pode usar linhas de contorno de densidade ( ggplot2 ):

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

insira a descrição da imagem aqui

Ou combine contornos de densidade com mistura alfa:

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

insira a descrição da imagem aqui

Você pode achar útil o pacote hexbin . Na página de ajuda do hexbinplot 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) 

hexágono

Uma visão geral de várias boas opções no ggplot2 :

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

Opção A: pontos transparentes

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

Opção B: adicionar contornos de densidade

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

Opção C: adicionar contornos de densidade preenchidos

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

Opção D: mapa de calor de densidade

 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') 

Opção E: hexbins

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

Opção F: tapetes

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

Combine em uma figura:

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

insira a descrição da imagem aqui