web-dev-qa-db-fra.com

Comment créer une carte thermique de densité continue de données de dispersion 2D dans R?

Je peux générer un graphique de densité de données 1D avec:

qplot(mydatapoints, geom='density')

J'ai également vu de nombreux exemples de grilles de cartes thermiques, mais elles s'apparentent davantage à des histogrammes pour des données 1D dans la mesure où les données sont placées dans des compartiments discrets au lieu d'afficher une courbe lisse.

Puis-je tracer quelque chose de similaire à la densité 1D mais pour les données 2D, avec (disons) quelque chose comme teinte/saturation/luminosité pour représenter la densité?

22
Yang

Je pense que vous voulez une estimation de densité 2D, qui est implémentée par kde2d Dans le package MASS.

df <- data.frame(x=rnorm(10000),y=rnorm(10000))

via MASS et base R:

k <- with(df,MASS:::kde2d(x,y))
filled.contour(k)

via ggplot (geom_density2d() appelle kde2d())

library(ggplot2)
ggplot(df,aes(x=x,y=y))+geom_density2d()

Je trouve que filled.contour Est plus attrayant, mais c'est très compliqué de travailler avec si vous voulez modifier quoi que ce soit car il utilise layout et reprend la mise en page. S'appuyant sur la réponse de Brian Diggs, qui remplit les couleurs entre les contours: voici l'équivalent avec différents niveaux alpha, avec des points transparents ajoutés pour comparaison.

ggplot(df,aes(x=x,y=y))+
  stat_density2d(aes(alpha=..level..), geom="polygon") +
  scale_alpha_continuous(limits=c(0,0.2),breaks=seq(0,0.2,by=0.025))+
  geom_point(colour="red",alpha=0.02)+
  theme_bw()

enter image description here

29
Ben Bolker

Combiner deux autres réponses (l'une pointant vers geom_density2d et une donnant des exemples de données et scale_colour_gradient):

df <- data.frame(x=rnorm(10000),y=rnorm(10000))
ggplot(df,aes(x=x,y=y))+
    stat_density2d(aes(fill=..level..), geom="polygon") +
    scale_fill_gradient(low="blue", high="green")
9
Brian Diggs

Il y a aussi scale_colour_gradient()

df <- data.frame(x=rnorm(10000),y=rnorm(10000))
ggplot(df, aes(x,y,colour=y)) + geom_point() + scale_colour_gradient(low="blue",high="red")
1
Brandon Bertelsen