2017-09-29 17 views
0

Die Daten beschreiben die Verteilung von Waren (Äpfel und Bananen) auf den Bäumen entlang der Straße zwischen zwei Dörfern, Villariba und Villabajo, die 4000 + m lang ist. Die Daten sind entweder bereits gruppiert (d. H. Werden alle 500 m zusammengefasst) oder mit großen Ortsfehlern geliefert, so dass ein Binning um 500 m natürlich ist. Wir wollen sie als geglättete Postfact Verteilungen über Kernel-Glättung verarbeiten und plotten. Es gibt zwei offensichtliche Möglichkeiten, dies in ggplot2 Paket zu tun. Lesen Sie zuerst die Daten (langes Format).R: Glätten von binned Daten in Barplots mit 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") 

Der erste Versuch ist eine langweilige BarPlot mit geom_col(). Als nächstes können wir zwei ggplot2-Einrichtungen verwenden, die in Dichteplots (geom_density()) und in Glättungskurven (stat_smooth() oder äquivalent geom_smooth()) enthalten sind. Die drei Weisen realisiert werden, wie folgt:

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

Es gibt Mängel jeder Methode. Das Diagramm mit der überlagerten Dichte (unteres Diagramm) ist das am meisten gewünschte Design, aber die Option stat="identity" (da die Daten gruppiert sind) verhindert, dass eine fein aussehende glatte Verteilung entsteht, wie es normalerweise der Fall ist. Die stat_smooth() Option bietet fast ausgezeichnete Kurven, aber das sind nur Kurven. Also: Wie kombiniere ich die Farb- und Dichtedarstellung und die Glättung von der Glättungsfunktion? Das heißt entweder Daten in geom_density() zu glätten oder den Raum mit semitransparenten Farben unter stat_smooth() Kurven zu füllen? Hier

Antwort

2

Wenn Sie Ihren gam fits möchten, können Sie stat = "smooth" innerhalb geom_ribbon verwenden, um die Kurven zu zeichnen. Der Trick besteht darin, ymin zu 0 und ymax zu ..y.., die die spezielle Variable ist, die von stat_smooth erstellt wird, die die vorhergesagte Linie ist, festzulegen.

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

ist ein Weg:

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)) 

Extract Kurven mit 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"))) 

Add Farbe mit 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

vollständige Antwort:

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

Verwandte Themen