2013-04-05 6 views
8

Sto imparando a utilizzare ggplot2 e sto cercando il più piccolo codice ggplot2 che riproduce il risultato base::plot di seguito. Ho provato alcune cose e sono finite per essere terribilmente lunghe, quindi cerco l'espressione più piccola e preferirei avere le date sull'asse x (che non ci sono nello plot di seguito) .grafico cumulativo utilizzando ggplot2

df = data.frame(date = c(20121201, 20121220, 20130101, 20130115, 20130201), 
       val = c(10, 5, 8, 20, 4)) 
plot(cumsum(rowsum(df$val, df$date)), type = "l") 

risposta

22

Prova questo:

ggplot(df, aes(x=1:5, y=cumsum(val))) + geom_line() + geom_point() 

enter image description here

è sufficiente rimuovere geom_point() se non lo vuoi.

Edit: Dal momento che si richiede di tracciare i dati come ad esempio con etichette X sono date, è possibile tracciare con x=1:5 e utilizzare scale_x_discrete per impostare una nuova labelsdata.frame. Prendendo df:

ggplot(data = df, aes(x = 1:5, y = cumsum(val))) + geom_line() + 
     geom_point() + theme(axis.text.x = element_text(angle=90, hjust = 1)) + 
     scale_x_discrete(labels = df$date) + xlab("Date") 

enter image description here

Dal momento che dire avrete più di 1 val per "data", è possibile aggregare loro in primo luogo utilizzando plyr, per esempio.

require(plyr) 
dd <- ddply(df, .(date), summarise, val = sum(val)) 

Poi si può procedere con lo stesso comando, sostituendo x = 1:5 con x = seq_len(nrow(dd)).

+0

Grazie, che è abbastanza lungo rispetto al 'plot'. Può 'ggplot' almeno riscattarsi aggiungendo le date sull'asse' x ', probabilmente ruotato di 90 gradi? :) – eddi

+0

quote: "e idealmente vorrebbe avere le date sull'asse x (che non ci sono nella trama sottostante)." – eddi

+0

Ho anche provato a modificare il tuo post per risolverlo per il caso in cui ci sono più di 1 val per data, ma la modifica non è andata a buon fine. – eddi

1

Dopo un paio d'anni, ho stabilirono a fare:

ggplot(df, aes(as.Date(as.character(date), '%Y%m%d'), cumsum(val))) + geom_line()