2016-05-05 8 views
1

3-variables Je travaille actuellement sur un data.frame très simple, contenant trois colonnes:complotant heatmap ggplot2

x contient les coordonnées x d'un ensemble de points,

y contient les coordonnées y du ensemble de points, et

weight contient une valeur associée à chaque point;

Maintenant, en travaillant dans ggplot2 je semble être en mesure de tracer des niveaux de contour pour ces données, mais je n'arrive pas à trouver un moyen de remplir le tracé en fonction de la variable weight. Voici le code que j'ai utilisé:

ggplot(df, aes(x,y, fill=weight)) + 
    geom_density_2d() + 
    coord_fixed(ratio = 1) 

Vous pouvez voir qu'il n'y a aucun remplissage, malheureusement. J'essaie depuis trois jours maintenant, et je commence à être déprimé.

La spécification de fill=weight et/ou color = weight dans l'appel général ggplot n'a abouti à rien. J'ai essayé d'utiliser des geoms différents (tile, raster, polygone ...), toujours rien. J'ai essayé de spécifier le aes directement dans la couche geom, n'a pas fonctionné. Essayé pour convertir l'objet en tant que ppp mais ggplot ne peut pas les gérer, et également en utilisant le tracé de base-R ne fonctionnait pas. Je n'ai honnêtement aucune idée de ce qui ne va pas! Je joins les données des 10 premiers points, qui est espacée sur une grille irrégulière:

x = c(-0.13397460,-0.31698730,-0.13397460,0.13397460,-0.28867513,-0.13397460,-0.31698730,-0.13397460,-0.28867513,-0.26794919) 

y = c(-0.5000000,-0.6830127,-0.5000000,-0.2320508,-0.6547005,-0.5000000,-0.6830127,-0.5000000,-0.6547005,0.0000000) 

weight = c(4.799250e-01,5.500250e-01,4.799250e-01,-2.130287e+12,5.798250e-01,4.799250e-01,5.500250e-01,4.799250e-01,5.798250e-01,6.618956e-01) 

tout conseiller? La sortie souhaitée serait quelque chose le long de ces lignes:

click

Merci à l'avance.

+1

On dirait que vous vous détournez une parcelle de densité. Les diagrammes de densité sont destinés à estimer les fonctions de densité de probabilité sous-jacentes (une fonction qui s'intègre à 1 sur l'espace échantillon). Peut-être que vous voulez une forme d'interpolation pour répartir les valeurs de fonction sur une surface? Mais dans ce cas, vous devrez choisir une forme de modélisation statistique pour l'interpolation. – MrFlick

+0

Avez-vous essayé d'examiner la fonction 'filled.contour'? Vous devez d'abord interpoler vos données avec quelque chose comme 'library (akima)' 'int.ds <- interp (df $ x, df $ y, df $ poids, duplicate =" strip ")'. Ensuite, vous pourriez faire quelque chose comme 'filled.contour (int.ds)' –

Répondre

1

De votre description geom_density ne semble pas correcte.

Vous pouvez essayer geom_raster:

ggplot(df, aes(x,y, fill = weight)) + 
    geom_raster() + 
    coord_fixed(ratio = 1) + 
    scale_fill_gradientn(colours = rev(rainbow(7)) # colourmap 
1

Voici une deuxième meilleure en utilisant fill=..level... There is a good explanation on ..level.. here.

# load libraries 
    library(ggplot2) 
    library(RColorBrewer) 
    library(ggthemes) 

# build your data.frame 
df <- data.frame(x=x, y=y, weight=weight) 

# build color Palette 
    myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")), space="Lab") 


# Plot 
    ggplot(df, aes(x,y, fill=..level..)) + 
     stat_density_2d(bins=11, geom = "polygon") + 
     scale_fill_gradientn(colours = myPalette(11)) + 
     theme_minimal() + 
     coord_fixed(ratio = 1) 

enter image description here

+0

Ceci n'utilise pas de poids. – Axeman

+0

Bonjour @Axeman, vous avez raison. Ma réponse n'utilise pas 'fill = poids ', c'est pourquoi j'ai dit que c'est un' deuxième meilleur '. Pour autant que je sache, il n'est pas possible de passer un vecteur de données à 'remplir 'dans' stat_density_2d'. Un peu d'explication dans le [Lien] (http://stackoverflow.com/questions/32206623/what-does-level-mean-in-ggplotstat-density2d/32207207?noredirect = 1 # comment57518193_32207207) J'ai posté avec ma réponse. –