2013-07-15 2 views
5

Wie kann ich die relativen Anteile von zwei Gruppen mit einer Füllästhetik in ggplot2 darstellen?Wie kann ich die relativen Anteile von zwei Gruppen mit einer Füllästhetik in ggplot2 darstellen?

Ich frage diese Frage hier, weil einige andere Antworten zu diesem Thema falsch scheinen (ex1, ex2 und ex3), aber Kreuz Validated scheint funktionell verboten R spezifische Fragen zu haben (CV meta). ..density.. ist konzeptuell verwandt mit Proportionen (ex4 und ex5). Die richtige Antwort scheint also keine Dichte zu beinhalten.

Beispiel:

set.seed(1200) 
test <- data.frame(
    test1 = factor(sample(letters[1:2], 100, replace = TRUE,prob=c(.25,.75)),ordered=TRUE,levels=letters[1:2]), 
    test2 = factor(sample(letters[3:8], 100, replace = TRUE),ordered=TRUE,levels=letters[3:8]) 
) 
ggplot(test, aes(test2)) + geom_bar(aes(y = ..density.., group=test1, fill=test1) ,position="dodge") 
#For example, the plotted data shows level a x c as being slightly in excess of .15, but a manual calculation shows a value of .138 
counts <- with(test,table(test1,test2)) 
counts/matrix(rowSums(counts),nrow=2,ncol=6) 

Die Antwort, die eine Ausgabe, die ist correct Resorts zu einer Lösung zu ergeben scheint, die nicht ggplot2 nicht verwendet (es außerhalb von ggplot2 Berechnung) oder erfordert, dass ein Panel eher verwendet werden als eine Fülle Ästhetik.

Bearbeiten: Digging in stat_bin ergibt, dass die letztlich aufgerufene Funktion ist bin, aber nur bin übergibt die Werte in der x AES. Ohne stat_bin neu schreiben zu müssen (oder einen anderen stat_ zu machen), kann der Hack, der in der oben angegebenen Antwort angewendet wurde, auf die Aes in Abwesenheit der Gruppe aes mit folgendem Code für die Aes: y = ..count../sapply(fill, FUN=function(x) sum(count[fill == x])) verallgemeinert werden. Dies ersetzt nur PANEL (die versteckte Spalte, die am Ende von StatBin vorhanden ist) mit fill). Vermutlich könnten andere versteckte Variablen die gleiche Behandlung bekommen.

+0

Wie verallgemeinern diese Fälle, wo ich, sagen wir, ein Grundstück in Gruppen aufgeteilt und facettiert dann in Form von Tafeln? – RoyalTS

+0

@RoyalTS: Ich glaube, dass das gleiche Problem gilt, weil das Problem darin besteht, dass es in ggplot2 keine entsprechende Funktion stat_ gibt (oder nicht war). Ich habe einen Lösungsentwurf geschrieben, der als Drop-In mit ggplot2 funktioniert ... aber ich bin mir nicht sicher, wie solide er ist, also habe ich ihn nicht gepostet. – russellpierce

Antwort

5

Dies ist ein aweful Hack, aber es scheint zu tun, was Sie wollen ...

ggplot(test, aes(test2)) + geom_bar(aes(y = ..count../rep(c(sum(..count..[1:6]), sum(..count..[7:12])), each=6), 
            group=test1, fill=test1) ,position="dodge") + 
             scale_y_continuous(name="proportion") 
+4

+1, obwohl es ein furchtbarer Hack ist. Wie haben Sie die zugrundeliegende Datenstruktur von ..count ermittelt, um das herauszufinden? Das zu wissen, ist der Schlüssel zu etwas, das wie eine allgemeine Lösung aussieht. – russellpierce

Verwandte Themen