2012-06-14 23 views
12

Szukam porady na temat lepszych sposobów obliczania proporcji obserwacji w różnych kategoriach.Grafy ggplot proporcji obserwacji w kategoriach

Mam dataframe, który wygląda mniej więcej tak:

cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low") 
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young") 
df <- as.data.frame(cbind(cat1, cat2)) 

Na przykład tutaj, chcę wykreślić część każdej grupie wiekowej które mają wartość „wysoki”, a odsetek każdej grupy wiekowej, które mają wartość "niska". Bardziej ogólnie, chcę wykreślić, dla każdej wartości kategorii 2, procent obserwacji, które mieszczą się na każdym z poziomów kategorii 1.

Poniższy kod daje właściwy wynik, ale tylko poprzez ręczne zliczanie i dzielenie przed spiskiem. Czy istnieje dobry sposób na wykonanie tego w locie w ggplot?

library(plyr) 
count1 <- count(df, vars=c("cat1", "cat2")) 
count2 <- count(df, "cat2") 

count1$totals <- count2$freq 
count1$pct <- count1$freq/count1$totals 

ggplot(data = count1, aes(x=cat2, y=pct))+ 
facet_wrap(~cat1)+ 
geom_bar() 

This previous stackoverflow question oferuje coś podobnego, z następującego kodu:

ggplot(mydataf, aes(x = foo)) + 
geom_bar(aes(y = (..count..)/sum(..count..))) 

Ale nie chcę „suma (.. liczyć ..)” - co daje sumę zliczania wszystkich pojemniki - w mianowniku; raczej chcę sumę wartości każdej z kategorii "cat2". Przestudiowałem również dokumentację stat_bin.

Byłbym wdzięczny za wszelkie wskazówki i sugestie, jak to zrobić.

+1

Oprócz odpowiedzi udzielę ci również odpowiedzi [this] (http://stackoverflow.com/a/10888762/324364), która może być przydatna. (Należy jednak pamiętać, że takie hacki mogą nie przetrwać, ponieważ ggplot zostanie zaktualizowany do kolejnych wersji.) – joran

+0

Ponieważ nie jest to typowe podsumowanie danych, nie ma prostej składni, aby zrobić to w ggplot. Twoje najlepsze podejście polega na wstępnym podsumowaniu danych, tak jak to zrobiłeś. –

Odpowiedz

33

Rozumiem, jeśli nie jest to tak naprawdę, czego szukasz, ale znalazłem twój opis tego, co chciałeś bardzo zagmatwać, dopóki nie zdałem sobie sprawy, że po prostu próbujesz wizualizować swoje dane w sposób, który wydawał się bardzo nienaturalny Dla mnie.

Gdyby ktoś zapytał mnie produkować wykres z proporcji w każdej kategorii, prawdopodobnie zwrócić się do segmentowej wykresie słupkowym:

ggplot(df,aes(x = cat2,fill = cat1)) + 
    geom_bar(position = "fill") 

enter image description here

zanotować Rejestry oś Y proporcje, nie liczy się, jak chciałeś.

+0

dzięki, jest to doskonałe rozwiązanie.Dzięki za dostarczenie mi świetnej alternatywy do tego, co próbowałem zrobić. – user1257313

+0

Dzięki, jest to bardzo dobra, ale również bardzo prosta odpowiedź, która powinna pomóc wielu ludziom, którzy mylą się i komplikują rzeczy (jak ja właśnie teraz). –

+0

cat1 musi być zmienną czynnikową, wydaje się nie działać, jeśli ciągły/numeryczny –

4

To może być trochę za późno dla ciebie i nie jest udziałem ggplot, ALE:

myślę mosaicplots są rozwiązaniem wizualizację interakcji dwóch czynników:

cat1 <- c("high", "low", "high", "high", "high", "low", "low", "low", "high", "low", "low") 
cat2 <- c("1-young", "3-old", "2-middle-aged", "3-old", "2-middle-aged", "2-middle-aged", "1-young", "1-young", "3-old", "3-old", "1-young") 
df <- as.data.frame(cbind(cat1, cat2)) 

mosaicplot(cat2 ~ cat1, data = df, col = c(lightskyblue2', 'tomato')) 

mosaic plot of data with two factors

Na tym wykresie pola dla każdej pary wartości są skalowane zgodnie z liczbą obserwacji w tej kategorii. Możesz podać wektor koloru, aby pomóc w wizualizacji.

Powiązane problemy