2013-07-15 21 views
5

Jak wykreślić względne proporcje dwóch grup za pomocą estetyki wypełnienia w ggplot2?Jak wykreślić względne proporcje dwóch grup za pomocą estetyki wypełnienia w ggplot2?

Zadaję to pytanie tutaj, ponieważ kilka innych odpowiedzi na ten temat wydają się błędne (ex1, ex2 i ex3), ale Krzyż Zatwierdzone wydaje się mieć konkretne pytania funkcjonalnie zakazane R (CV meta). ..density.. jest koncepcyjnie powiązany, ale różni się od proporcji (ex4 i ex5). Tak więc prawidłowa odpowiedź wydaje się nie obejmować gęstości.

przykład:

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) 

odpowiedź, która wydaje się, uzyskując wyjściowy, który jest correct ucieka się rozwiązanie, które nie wykorzystuje ggplot2 (liczonej go poza ggplot2) lub wymaga, aby zespół można stosować zamiast wypełnij estetykę.

Edycja: Kopanie w stat_bin daje pewność, że funkcja ostatecznie nazywa się bin, ale bin tylko przekazuje wartości w XAES. Bez przepisywania stat_bin (lub tworzenia kolejnego stat_) hack zastosowany w powyższej odpowiedzi może zostać uogólniony do wypełnienia aes pod nieobecność grupy aes z następującym kodem dla yes: y = ..count../sapply(fill, FUN=function(x) sum(count[fill == x])). To po prostu zastępuje PANEL (ukrytą kolumnę, która jest obecna na końcu StatBin) wypełnieniem). Prawdopodobnie inne ukryte zmienne mogłyby uzyskać takie samo traktowanie.

+0

Jak to uogólnić do przypadków, w których mam, powiedzmy, działka podzielona na grupy, a następnie szlifowane pod panelami? – RoyalTS

+0

@RoyalTS: Wierzę, że ten sam problem dotyczy, ponieważ problem polega na tym, że nie ma (lub nie było co najmniej) odpowiedniej funkcji stat_ w ggplot2. Napisałem rozwiązanie robocze, które działa jako wtyczka z ggplot2 ... ale nie jestem pewien, jak solidnie jest, więc nie opublikowałem go. – russellpierce

Odpowiedz

5

To straszne hack, ale wydaje się, aby robić to, co chcesz ...

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, mimo że jest to straszne włamanie. W jaki sposób określiłeś podstawową strukturę danych konta ..count? Aby to wymyślić? Wiedząc, że to jest klucz do znalezienia czegoś, co wygląda jak ogólne rozwiązanie. – russellpierce

Powiązane problemy