2011-01-10 13 views
10

sto usando la seguente struttura dei dati per cercare di fare un grafico ad area in pila:Fare una trama area in pila utilizzando ggplot2

df <- data.frame(PopDen = c(0.002279892, 0.002885407, 0.004291351, 0.002457731, 0.006631572, 0.007578882, 0.004465446, 0.007436628, 0.009001456, 0.006951703, 0.003602076, 0.005695585, 0.005819783, 0.007412274, 0.004931548, 0.006257411, 0.008635908, 0.005438558, 0.002251421,0.006438558), DomArea = c(253500, 135270, 197180, 131590, 142210, 166920, 125640, 184600, 139940, 126280, 127760, 190940, 133440, 143510, 117260, 69340, 143620, 127480, 181970,164180), PR_Cat = c("High", "High", "Low", "Low", "Low", "Low", "Low", "Low", "High", "High", "Medium", "Medium", "Medium", "Low", "Low", "Medium", "Medium", "Low", "Low","Low")) 

p <- ggplot(df, aes(PopDen, order(DomArea), colour = PR_Cat)) 
p + geom_area(aes(colour = PR_Cat, fill= PR_Cat), position = 'stack') 

Tuttavia, non capisco come impilare le aree in cima ad ogni altro; al momento si stanno sovrapponendo. Suppongo di aver bisogno di un argomento position = 'stack' qui, ma la trama sembra la stessa sia che sia inclusa o meno.

Inoltre, è possibile ordinare DomArea da una delle categorie in PR_Cat o sarebbe necessario riorganizzare i miei dati?

risposta

21

Non sono sicuro di quello che si sta tramando qui, ma non si vuole essere tramando PopDen lungo la y asse piuttosto che l'asse x ? È possibile ordinare la DomArea da ogni PR_Cat categoria utilizzando ddply dal pacchetto plyr, e quindi la sovrapposizione funziona come segue: EDIT mi sono reso conto che probabilmente desidera che il complotto per essere impilati nell'ordine Low, Medium High, quindi abbiamo bisogno di prima forza questo ordinamento sul fattore PR_Cat facendo:

df$PR_Cat <- ordered(df$PR_Cat, levels = c('Low', 'Medium', 'High')) 

E ora creare la colonna DomAreaByCat utilizzando ddply:

df <- ddply(df, .(PR_Cat), transform, DomAreaByCat = order(DomArea)) 

tuo df sarà simile a questa:

> df 
     PopDen DomArea PR_Cat DomAreaByCat 
1 0.004291351 197180 Low   8 
2 0.002457731 131590 Low   5 
3 0.006631572 142210 Low   9 
4 0.007578882 166920 Low   2 
5 0.004465446 125640 Low   3 
6 0.007436628 184600 Low   7 
7 0.007412274 143510 Low   11 
8 0.004931548 117260 Low   4 
9 0.005438558 127480 Low   10 
10 0.002251421 181970 Low   6 
11 0.006438558 164180 Low   1 
12 0.003602076 127760 Medium   4 
13 0.005695585 190940 Medium   1 
14 0.005819783 133440 Medium   3 
15 0.006257411 69340 Medium   5 
16 0.008635908 143620 Medium   2 
17 0.002279892 253500 High   4 
18 0.002885407 135270 High   2 
19 0.009001456 139940 High   3 
20 0.006951703 126280 High   1 

E allora si può fare la trama area in pila in questo modo:

p <- ggplot(df, aes(DomAreaByCat, PopDen)) 

p + geom_area(aes(colour = PR_Cat, fill= PR_Cat), position = 'stack') 

alt text

+0

grazie per la spiegazione chiara. Sono ancora insicuro su due cose però; perché dovrebbe essere tracciato DomAreaByCat? (Ho provato questo ma sembra simile al mio tentativo originale). Non è possibile tracciare DomArea? Il secondo problema che ho è che il mio set di dati completo è normalizzato a 1 (somma delle 3 categorie); eppure, quando tracciato, supera il punto 1 (http://imgur.com/1C5Cp), non riesco a immaginare che l'ordinamento cambi i valori di questi, ma non vedo come possa accadere. – djq

+0

@celenius - si scopre che i miei valori dell'asse x non erano univoci, il che ha comportato un po 'di impilamento. Quando ho usato valori completamente unici ha funzionato bene. – djq

+0

@celenius - vuoi dire che l'approccio sopra funziona bene ora? –

Problemi correlati