2011-02-17 18 views
20

Questa domanda è una continuazione del precedente question che ho chiesto.Ottenere un grafico ad area in pila in R

Ora ho un caso in cui c'è anche una colonna di categoria con Prop. Così, l'insieme di dati diventa come

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 

In questo caso ho bisogno di fare una trama area in pila in R con le percentuali di questi diverse categorie per ogni giorno. Quindi, il risultato sarà simile.

 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% 

Così ora vorrei ottenere la quota di ogni categoria in ogni ora e poi tracciare questo è un complotto area in pila come questo in cui l'asse x è l'ora e asse y la percentuale di prop2 per ogni categoria data dai diversi colori this

+1

direi che questo è piuttosto un caso di fortuna (197) ... ;-) –

risposta

7

È possibile utilizzare stackpoly dal pacchetto 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

Questo sembra funzionare e mi dà la trama di stack, ma non ci sono leggende dire quale pila colorata rappresenta quale categoria? – sfactor

+0

È necessario prima ordinare le categorie in modo da sapere quale è e quindi creare la propria legenda con il comando legend(). – John

+0

@sfactor Aggiunta una legenda di esempio, leggi '? Legend' per ulteriori dettagli su come funziona – James

26

È possibile utilizzare il pacchetto ggplot2 da Hadley Wickham per questo.

R> library(ggplot2) 

Un set di dati di esempio:

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 

E quindi è possibile utilizzare ggplot con geom_area:

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

enter image description here

+0

grazie, ma per quanto riguarda ottenere la condivisione (percentuale o rapporto) di ogni categoria per ogni ora dalla tabella iniziale al modulo visualizzato nel set di dati 'd' qui? – sfactor

+0

Scusa, non l'ho visto dalla tua domanda. In effetti, penso che 'ggplot2' possa farlo per te: ho modificato il mio post per mostrare come farlo. – juba

+0

scusa se mi preoccupo ancora di fare una semplificazione per quanto riguarda i dati, nella forma iniziale c'è la ripetizione della Categoria per ogni ora. Quindi, possono esserci più righe di Categoria A nell'ora 0, quindi come faccio ad aggregare prima ciascuna di queste categorie per ogni ora per ottenerla nel modulo che hai mostrato qui? – sfactor

-2

Se si vuole prendere i confini di distanza si può utilizzare scale_x_discrete e coord_cartesian questo modo

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

Per me questo raggruppa l'intero grafico per occupare solo una piccola parte dell'area del grafico sulla destra. –

Problemi correlati