2011-02-17 11 views
20

To pytanie jest kontynuacją poprzedniej wersji question.Uzyskiwanie wykresu warstwowego w R

Teraz mam przypadek, w którym znajduje się również kolumna kategoria z Prop. Tak, zestaw danych staje się jak

Hour Category  Prop2 

00  A   25 
00  B   59 
00  A   55 
00  C   5 
00  B   50 
... 
01  C   56 
01  B   45 
01  A   56 
01  B   35 
... 
23  D   58 
23  A   52 
23  B   50 
23  B   35 
23  B   15 

W tym przypadku muszę zrobić ułożone Powierzchnia działki w R z procentów od nich różne kategorie dla każdego dnia. Tak więc wynik będzie podobny.

 A   B  C  D 
00  20%  30%  35%  15% 
01  25%  10%  40%  25% 
02  20%  40%  10%  30% 
. 
. 
. 
20 
21 
22  25%  10%  30%  35% 
23  35%  20%  20%  25% 

Więc teraz chciałbym dostać udziału każdej kategorii, w każdej godzinie, a następnie wykreślić ten jest ułożone działki jak ta, gdzie oś x jest godzina, a oś y odsetek Prop2 dla każdej kategorii przyznana przez różnych kolorach this

+1

powiedziałbym jest to raczej przypadek losu (197) ... ;-) –

Odpowiedz

7

można użyć stackpoly z pakietu plotrix:

library(plotrix) 
#create proportions table 
pdat <- prop.table(xtabs(Prop2~Hour+Category,Dat),margin=1) 
#draw chart 
stackpoly(pdat,stack=T,xaxlab=rownames(pdat)) 
#add legend 
legend(1,colnames(pdat),bg="#ffffff55",fill=rainbow(dim(pdat)[2])) 
+0

To wydaje się działać i daje mi działkę stosu, ale nie istnieją żadne legendy powiedzieć, który kolorowy stos reprezentuje którą kategorię? – sfactor

+0

Najpierw należy posortować kategorie, aby wiedzieć, która jest która, a następnie utworzyć własną legendę za pomocą polecenia legend(). – John

+0

@sfactor Dodano przykładową legendę, przeczytaj '' legend', aby uzyskać więcej informacji o tym, jak to działa – James

26

można użyć pakietu ggplot2 od Hadley Wickham za to.

R> library(ggplot2) 

zestaw przykład dane:

R> d <- data.frame(t=rep(0:23,each=4),var=rep(LETTERS[1:4],4),val=round(runif(4*24,0,50))) 
R> head(d,10) 
    t var val 
1 0 A 1 
2 0 B 45 
3 0 C 6 
4 0 D 14 
5 1 A 35 
6 1 B 21 
7 1 C 13 
8 1 D 22 
9 2 A 20 
10 2 B 44 

a następnie można użyć ggplot z geom_area:

R> ggplot(d, aes(x=t,y=val,group=var,fill=var)) + geom_area(position="fill") 

enter image description here

+0

dzięki, ale co z uzyskaniem udziału (procentu lub stosunku) każdej kategorii dla każdej godziny od początkowej tabeli do formularza wyświetlanego w zbiorze danych "d" tutaj? – sfactor

+0

Niestety, nie widzę tego z Twojego pytania. W rzeczywistości myślę, że 'ggplot2' może to dla ciebie zrobić: zredagowałem swój post, aby pokazać, jak to zrobić. – juba

+0

Przepraszam, że znów się trudzę, ale wciąż upraszczasz dane, w początkowej formie powtarzają się kategorie dla każdej godziny. Tak więc w godzinie 0 może być wiele wierszy kategorii A, więc w jaki sposób mogę zbiorczo każdą z tych kategorii za każdą godzinę, aby wprowadzić ją do formularza, który tutaj pokazałeś? – sfactor

-2

Jeśli chcesz wziąć granice z dala można użyj scale_x_discrete i coord_cartesian ten sposób

p <- ggplot(d, aes(x=Date,y=Volume,group=Platform,fill=Platform)) + geom_area(position="fill") 
base_size <- 9 
p + theme_set(theme_bw(base_size=9)) + scale_x_discrete(expand = c(0, 0)) + coord_cartesian(ylim=c(0,1)) 
+0

Dla mnie ten wykres składa się z całego wykresu i zajmuje tylko niewielki ułamek powierzchni działki po prawej stronie. –