2017-10-27 2 views
0

ist, gibt es eine elegante Möglichkeit, Wert Ihrer Facetten auf einem facet_grid(var1~var2) Grundstück auf einer gruppierten Aggregation angewendet hinzuzufügen, wobei eine Aggregation zu einem sum ähnlich ist, mean, sd usw.erstellen Wert Ihrer Facetten in ggplot facet_grid

Der " Die gesamte Facette sollte dieselbe Aggregation wie die anderen Facetten verwenden.

Die folgende Grafik zeigt ein Beispiel für die Verwendung von mean. Es gibt insgesamt 6 Zwischensummen und 1 Gesamtfacetten. Jede Facette liefert den Mittelwert für jeden Kohlenhydratwert.

Facets with total facets

Mein Ansatz unten ist klobig und ausführlich. Ein Ansatz, der verallgemeinert wird, um eine allgemeine Anzahl von x- und y-Facettierungs-/Gruppierungsvariablen zu handhaben, ist wünschenswert. Ich könnte eine Funktion programmieren, die abhängig von den Gruppierungen in der Aggregation eine ganze Reihe von uneleganten bedingten Berechnungen durchführt, aber ich suche wirklich nach etwas Bequemem und Einfachem. Tidyverse Lösungen bevorzugt.

library(dplyr) 
library(ggplot2) 
# use mtcars data set 
data <- mtcars 

# aggregate data by grouping variables 
aggregate_data<- data%>% 
    group_by(gear,cyl, carb)%>% 
    summarize(mpg=mean(mpg))%>% 
    ungroup 

# get total for gear 
data_tot_cyl<- data%>% 
    group_by(cyl, carb)%>% 
    summarize(mpg=mean(mpg))%>% 
    ungroup%>% 
    mutate(gear='total') 

# get total for cyl 
data_tot_gear<- data%>% 
    group_by(gear, carb)%>% 
    summarize(mpg=mean(mpg))%>% 
    ungroup%>% 
    mutate(cyl='total') 

# get total for total-total 
data_tot_tot<- data%>% 
    group_by(carb)%>% 
    summarize(mpg=mean(mpg))%>% 
    ungroup%>% 
    mutate(cyl='total', gear='total') 

# get data frame with all total's data. 
new_data<-data_tot_tot%>% 
    bind_rows(data_tot_gear%>%mutate(gear=as.character(gear)))%>% 
    bind_rows(data_tot_cyl%>%mutate(cyl=as.character(cyl)))%>% 
    bind_rows(aggregate_data%>%mutate_at(vars(gear, cyl), funs(as.character))) 

# Arghh, gotta order the levels so total is at the end. 
new_data$cyl <- factor(new_data$cyl, 
         levels=c('4','6','8','total'),ordered=T) 
new_data$gear <- factor(new_data$gear, 
         levels=c('3','4','5','total'),ordered=T) 

# Finally after over 20 additional lines of code, I get the 
# faceted plot with totals for x and y facets. 
p<-ggplot(new_data, aes(x=carb, y=mpg))+ 
    geom_bar(stat='identity')+ 
    facet_grid(cyl~gear)+ 
    geom_text(aes(label=round(mpg,1), y=0), 
      col='white', size=3,hjust=-0.3, angle=90)+ 
    ggtitle('Average MPG vs Num Carbs, by Num Cylinders & Num Gears') 
print(p) 
+0

dieses Q gefunden https://stackoverflow.com/questions/18933575/easily-add-an-all-facet-to-facet-wrap-in-ggplot2. Das tut nicht, was ich suche, weil ich gerade versuche, die Gitterstruktur mit facet_grid zu behalten. –

+0

klärte ein wenig Q, änderte von geom_point zu geom_bar und änderte den Datensatz in mtcars, um den Punkt besser zu veranschaulichen. –

Antwort

0

ggplot kann es direkt aus dem ursprünglichen Datenrahmen tun. Aber die geom_text zeigt immer noch die einzelnen Zeilenwerte, anstatt die Aggregation.

p3<-ggplot(mtcars, aes(x=carb, y=mpg))+ 
    stat_summary(fun.y="mean", geom="bar")+ 
    facet_grid(cyl~gear, margins=T)+ 
    geom_text(aes(label=round(..y..,1)), 
      col='red', size=3,hjust=-0.3, angle=90)+ 
    ggtitle('Average MPG vs Num Carbs, by Num Cylinders & Num Gears') 
print(p3) 

Und es ermöglicht Ihnen, die Aggregation von einer facet_grid-Kombination zu gruppieren. Z.B.

p4<-ggplot(mtcars, aes(x=carb, y=mpg))+ 
    stat_summary(fun.y="mean", geom="bar")+ 
    facet_grid(am+vs~gear, margins=T)+ 
    geom_text(aes(label=round(..y..,1)), 
      col='red', size=3,hjust=-0.3, angle=90)+ 
    ggtitle('Average MPG vs Num Carbs, by Num Gears and vs & am') 
print(p4) 

enter image description here

0

Sie die margins Option in Ihrer facet_grid() Funktion verwenden. Siehe die folgenden:

p2 <- ggplot(aggregate_data, aes(x=1, y=value))+ 
    geom_point()+ 
    facet_grid(dist~scale, margins = TRUE) 
p2 
+0

Das macht die Aggregation auf den (allen) Facetten nicht richtig. Es funktioniert, wenn die Aggregation eine Summe ist, aber nicht anders. –

Verwandte Themen