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