146 votes

R: Nuage de points avec beaucoup trop de points

Je suis en train de tracer les deux variables où N=700K. Le problème, c'est qu'il y a trop de chevauchement, de sorte que le terrain devient essentiellement un bloc de couleur noire. Est-il possible de l'avoir en niveaux de gris "cloud", où la noirceur de l'intrigue est une fonction du nombre de points dans une région? En d'autres termes, au lieu de montrer différents points, je veux l'intrigue à un "nuage" de, avec des la plus le nombre de points dans une région, le plus sombre de cette région.

156voto

joran Points 68079

Une façon de traiter cette question est avec alpha blending, qui fait de chaque point légèrement transparent. Donc, les régions apparaissent plus sombres qui ont plus de point de tracé sur eux.

C'est facile à faire dans 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

Un autre moyen pratique de traiter cette question est (et probablement plus approprié pour le nombre de points que vous avez) est hexagonale, binning:

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

enter image description here

Et il y a aussi des vieux rectangulaire binning (image omis), qui est plus proche de votre traditionnelle heatmap:

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

64voto

majom Points 1304

Vous pouvez également jeter un oeil à l' ggsubplot package. Ce package met en œuvre des fonctionnalités qui ont été présentés par le Hadley Wickham en 2011 (http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html).

(Dans la suite, j'ai inclure les "points"de la couche à des fins d'illustration.)

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

Cependant, cette caractéristiques de roches si vous avez une troisième variable de contrôle.

# 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

Ou une autre approche serait d'utiliser smoothScatter():

smoothScatter(dat[2:3])

enter image description here

54voto

Aaron Points 15093

Alpha blending est facile à faire avec des graphismes de base.

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

enter image description here

47voto

ROLO Points 2464

Vous pouvez également utiliser la densité des lignes de contour (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

Ou encore, une combinaison de la densité de contours avec de l'alpha blending.

30voto

Oscar Perpiñán Points 1938

Vous pouvez trouver utile l' hexbin package. À partir de la page d'aide 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X