2017-09-29 4 views
0

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) 

three plots with density smoothing in ggplot2

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?

Répondre

2

Si vous aimez vos gam fits, vous pouvez utiliser stat = "smooth" dans les geom_ribbon pour dessiner les courbes. L'astuce consiste à définir ymin à 0 et ymax à ..y.., qui est la variable spéciale créée par stat_smooth qui est la ligne prévue.

ggplot(databas, aes(x = dist, y = val, fill = stuff)) + 
    geom_ribbon(stat = "smooth", aes(ymin = 0, ymax = ..y..), alpha = .5, 
       method = "gam", se=FALSE, formula = y ~ s(x, k = 7)) 

enter image description here

2

Voici une façon:

library(ggplot2) 
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)) 

courbes Extrait avec ggplot_build

p2_build = ggplot_build(p2) 
p2_fill <- data_frame(
    x = p2_build$data[[1]]$x, 
    y = p2_build$data[[1]]$y, 
    group = factor(p2_build$data[[1]]$group, levels = c(1,2), labels = c("apples","bananas"))) 

ajouter de la couleur avec geom_area

p2 + geom_area(data = p2_fill[p2_fill$group == "apples", ], 
        aes(x=x, y=y), fill = "red", alpha = 0.2)+ 
    geom_area(data = p2_fill[p2_fill$group == "bananas", ], 
      aes(x=x, y=y), fill = "blue", alpha = 0.2) 

enter image description here

réponse complète:

ggplot(databas, aes(dist, val, color = stuff))+ 
    stat_smooth(aes(y = val,x = dist), method = "gam",se = FALSE, formula = y ~ s(x, k = 7))+ 
    geom_area(data = p2_fill[p2_fill$group == "apples", ], 
      aes(x=x, y=y), fill = "#F8766D", alpha = 0.2, inherit.aes = F)+ 
    geom_area(data = p2_fill[p2_fill$group == "bananas", ], 
      aes(x=x, y=y), fill = "#00BFC4", alpha = 0.2, inherit.aes = F)+ 
    theme_classic() 

enter image description here