Nuage de points avec contour / superposition de chaleur

23

J'ai vu ce complot dans le supplément d'un article récent et j'aimerais pouvoir le reproduire en utilisant R. C'est un nuage de points, mais pour corriger le surplotage, il y a des lignes de contour qui sont "à chaud" de couleur bleu à rouge correspondant à la surplacer la densité. Comment pourrais-je faire ça?

entrez la description de l'image ici

Stephen Turner
la source
5
Cette question StackOverflow montre quelques options de ggplot2 pour ce type de tracé, y compris le nuage de points + points.
joran

Réponses:

30

Voici mon point de vue, en utilisant les fonctions de base uniquement pour dessiner des trucs:

library(MASS)  # in case it is not already loaded 
set.seed(101)
n <- 1000
X <- mvrnorm(n, mu=c(.5,2.5), Sigma=matrix(c(1,.6,.6,1), ncol=2))

## some pretty colors
library(RColorBrewer)
k <- 11
my.cols <- rev(brewer.pal(k, "RdYlBu"))

## compute 2D kernel density, see MASS book, pp. 130-131
z <- kde2d(X[,1], X[,2], n=50)

plot(X, xlab="X label", ylab="Y label", pch=19, cex=.4)
contour(z, drawlabels=FALSE, nlevels=k, col=my.cols, add=TRUE)
abline(h=mean(X[,2]), v=mean(X[,1]), lwd=2)
legend("topleft", paste("R=", round(cor(X)[1,2],2)), bty="n")

entrez la description de l'image ici

Pour un rendu plus sophistiqué, vous voudrez peut-être jeter un œil à ggplot2 et stat_density2d(). Une autre fonction que j'aime est smoothScatter():

smoothScatter(X, nrpoints=.3*n, colramp=colorRampPalette(my.cols), pch=19, cex=.8)

entrez la description de l'image ici

chl
la source
2
Ce serait bien si l'on pouvait contrôler le tracé de contour pour inclure les quantiles / centiles / déciles spécifiés (ou ce que vous avez).
Roman Luštrik
Awsesome, je cherchais un smth comme ça depuis longtemps, un tracé de bonne qualité
WAF
26

Personne n'a suggéré ggplot2 pour cela ??

library(MASS)
library(ggplot2)
n <- 1000
x <- mvrnorm(n, mu=c(.5,2.5), Sigma=matrix(c(1,.6,.6,1), ncol=2))
df = data.frame(x); colnames(df) = c("x","y")

commonTheme = list(labs(color="Density",fill="Density",
                        x="RNA-seq Expression",
                        y="Microarray Expression"),
                   theme_bw(),
                   theme(legend.position=c(0,1),
                         legend.justification=c(0,1)))

ggplot(data=df,aes(x,y)) + 
  geom_density2d(aes(colour=..level..)) + 
  scale_colour_gradient(low="green",high="red") + 
  geom_point() + commonTheme

Ce qui produit ce qui suit:

Exemple 1

Cependant, d'autres choses peuvent être faites aussi très facilement, comme les suivantes:

ggplot(data=df,aes(x,y)) + 
  stat_density2d(aes(fill=..level..,alpha=..level..),geom='polygon',colour='black') + 
  scale_fill_continuous(low="green",high="red") +
  geom_smooth(method=lm,linetype=2,colour="red",se=F) + 
  guides(alpha="none") +
  geom_point() + commonTheme

Ce qui produit ce qui suit:

entrez la description de l'image ici

ADP
la source