R Scatter Plot: la couleur du symbole représente le nombre de points qui se chevauchent

Les diagrammes de dispersion

peuvent être difficiles à interpréter lorsque plusieurs points se chevauchent, car ce chevauchement obscurcit la densité des données dans une région particulière. Une solution est d'utiliser des couleurs semi-transparentes pour les points tracés, de sorte que la région opaque indique que de nombreuses observations sont présentes dans ces coordonnées.

ci-dessous est un exemple de ma solution en noir et blanc dans R:

MyGray <- rgb(t(col2rgb("black")), alpha=50, maxColorValue=255)
x1 <- rnorm(n=1E3, sd=2)
x2 <- x1*1.2 + rnorm(n=1E3, sd=2)
dev.new(width=3.5, height=5)
par(mfrow=c(2,1), mar=c(2.5,2.5,0.5,0.5), ps=10, cex=1.15)
plot(x1, x2, ylab="", xlab="", pch=20, col=MyGray)
plot(x1, x2, ylab="", xlab="", pch=20, col="black")

The advantages of using <a href=opacity to indicate point density" src="/images/content/17093935/803221a0c83f39b19cffef660c86fd2b.png">

Cependant, je suis récemment tombé sur cet article dans PNAS , qui a pris une approche similaire, mais utilisé la coloration de la carte thermique par opposition à l'opacité comme indicateur du nombre de points se chevauchent. L'article est en Accès libre, donc n'importe qui peut télécharger le .pdf et consultez la Figure 1, qui contient un exemple de graphique que je veux créer. La section sur les méthodes de cet article indique que les analyses ont été effectuées dans Matlab.

Pour l'amour de commodité, voici une petite partie de la Figure 1 de l'article ci-dessus:

Figure 1 from Flombaum et al. 2013, PNAS

comment créer un nuage de points dans R qui utilise la couleur, pas l'opacité, comme indicateur de la densité ponctuelle?

pour commencer, les utilisateurs peuvent accéder à ce schéma de couleurs Matlab dans la bibliothèque install.packages("fields") , en utilisant la fonction tim.colors() .

est - il un moyen facile de faire un chiffre semblable à la Figure 1 de la au-dessus de l'article, mais en R? Merci!

14
demandé sur rbatt 2013-06-13 22:00:17

3 réponses

une option consiste à utiliser densCols() pour extraire les densités de grains à chaque point. Cartographier ces densités à la rampe de couleur désirée, et les points de pointage dans l'ordre croissant de la densité locale vous obtient un tracé un peu comme ceux dans l'article lié.

## Data in a data.frame
x1 <- rnorm(n=1E3, sd=2)
x2 <- x1*1.2 + rnorm(n=1E3, sd=2)
df <- data.frame(x1,x2)

## Use densCols() output to get density at each point
x <- densCols(x1,x2, colramp=colorRampPalette(c("black", "white")))
df$dens <- col2rgb(x)[1,] + 1L

## Map densities to colors
cols <-  colorRampPalette(c("#000099", "#00FEFF", "#45FE4F", 
                            "#FCFF00", "#FF9400", "#FF3100"))(256)
df$col <- cols[df$dens]

## Plot it, reordering rows so that densest points are plotted on top
plot(x2~x1, data=df[order(df$dens),], pch=20, col=col, cex=2)

enter image description here

30
répondu Josh O'Brien 2013-06-13 22:18:53

vous pouvez obtenir un effet similaire en faisant binning hexagonal, diviser la région en hexagones, colorier chaque hexagone basé sur le nombre de points dans l'hexagone. Le paquet hexbin a des fonctions pour faire cela et il y a aussi des fonctions dans le paquet ggplot2.

5
répondu Greg Snow 2013-06-13 18:48:02

Vous pouvez utiliser smoothScatter pour cela.

colramp = colorRampPalette(c('white', 'blue', 'green', 'yellow', 'red'))
smoothScatter(x1, x2, colramp=colramp)
3
répondu Matthew Plourde 2013-06-13 18:17:53