Scatterplot con troppi punti

Sto provando a tracciare due variabili dove N = 700K. Il problema è che c’è troppa sovrapposizione, quindi la trama diventa per la maggior parte un solido blocco di nero. C’è un modo per avere una “nuvola” in scala di grigi in cui l’oscurità della trama è una funzione del numero di punti in una regione? In altre parole, invece di mostrare i singoli punti, voglio che la trama sia una “nuvola”, con più il numero di punti in una regione, più scura quella regione.

Un modo per affrontarlo è con l’alpha blending, che rende ogni punto leggermente trasparente. Quindi le regioni appaiono più scure che hanno più punti tracciati su di loro.

Questo è facile da fare in ggplot2 :

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

inserisci la descrizione dell'immagine qui

Un altro modo conveniente per affrontare questo è (e probabilmente più appropriato per il numero di punti che hai) è il binning esagonale:

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

inserisci la descrizione dell'immagine qui

E c'è anche il classico binning rettangular (immagine omessa), che è più simile alla tua heatmap tradizionale:

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

Puoi anche dare un’occhiata al pacchetto ggsubplot . Questo pacchetto implementa funzionalità che sono state presentate da Hadley Wickham nel 2011 ( http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html ).

(Di seguito, includo i “punti” – per scopi illustrativi.)

 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) 

inserisci la descrizione dell'immagine qui

Tuttavia, questa funzionalità presenta delle rocce se si dispone di una terza variabile da controllare.

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

inserisci la descrizione dell'immagine qui

O un altro approccio sarebbe usare smoothScatter() :

 smoothScatter(dat[2:3]) 

inserisci la descrizione dell'immagine qui

La fusione alfa è facile anche con la grafica di base.

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

I primi sei numeri dopo il # sono il colore nell'esagono RGB e gli ultimi due sono l'opacità, di nuovo in esadecimale, quindi 33 ~ 3/16 ° opaco.

inserisci la descrizione dell'immagine qui

Puoi anche utilizzare le linee di contorno della densità ( ggplot2 ):

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

inserisci la descrizione dell'immagine qui

Oppure combina i contorni della densità con l'alpha blending:

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

inserisci la descrizione dell'immagine qui

Potresti trovare utile il pacchetto hexbin . Dalla pagina di aiuto di 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 panoramica di diverse buone opzioni in ggplot2 :

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

Opzione A: punti trasparenti

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

Opzione B: aggiungi contorni di densità

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

Opzione C: aggiungi contorni pieni di densità

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

Opzione D: mappa termica della densità

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

Opzione E: esagoni

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

Opzione F: tappeti

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

Combina in una figura:

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

inserisci la descrizione dell'immagine qui