Les données décrivent la distribution des produits (pommes et bananes) sur les arbres le long de la route entre deux villages, Villariba et Villabajo, qui a une longueur de plus de 4000 m. Les données sont soit déjà regroupées (c'est-à-dire sont résumées tous les 500 m), ou sont fournies avec de grandes erreurs d'emplacements, donc binning de 500 m est naturel. Nous souhaitons les traiter et les tracer sous forme de distributions lisses post factum via le lissage du noyau. Il existe deux façons évidentes de le faire dans le package ggplot2
. Première lecture des données (format long).R: lissage des données classées dans les graphiques à barres avec ggplot2
library(ggplot2)
databas<-read.csv(text="dist,stuff,val
500,apples,10
1250,apples,25
1750,apples,55
2250,apples,45
2750,apples,25
3250,apples,10
3750,apples,5
500,bananas,7
1250,bananas,14
1750,bananas,20
2250,bananas,17
2750,bananas,10
3250,bananas,30
3750,bananas,20")
Le premier essai est un barplot ennuyeux avec geom_col()
. Ensuite, nous pouvons utiliser deux facilités ggplot2 contenues dans les diagrammes de densité (geom_density()
) et dans les courbes de lissage (stat_smooth()
ou de manière équivalente geom_smooth()
) respectivement. Les trois voies sont réalisées comme suit:
p1<-ggplot(databas,aes(dist,val,fill=stuff,alpha=0.5))+geom_col(alpha=0.5,position="dodge")
p2<-ggplot(databas,aes(dist,val,fill=stuff))+stat_smooth(aes(y=val,x=dist),method="gam",se=FALSE,formula=y~s(x,k=7))
p3<-ggplot(databas,aes(dist,val,fill=stuff,alpha=0.5))+geom_density(stat="identity")
library(gridExtra)
grid.arrange(p1,p2,p3,nrow=3)
Il y a des lacunes de chaque méthode. La courbe de densité superposée (graphique du bas) est la conception la plus désirée, mais l'option stat="identity"
(puisque les données sont regroupées) empêche de créer une distribution lisse et élégante, comme c'était normalement le cas. L'option stat_smooth()
donne des courbes presque parfaites, mais ce ne sont que des courbes. Alors: comment combiner la coloration de la parcelle de densité et le lissage de la fonction de lissage? Cela est soit pour lisser les données dans geom_density(), ou pour remplir l'espace avec des couleurs semi-transparentes sous stat_smooth()
courbes?