2010-08-16 4 views
5

J'ai des données de séries chronologiques (je l'ai posté ici comme data.frame):Barplot totaux par mois avec ggplot?

x <- structure(list(date = structure(c(1264572000, 1266202800, 1277362800, 
1277456400, 1277859600, 1278032400, 1260370800, 1260892800, 1262624400, 
1262707200), class = c("POSIXt", "POSIXct"), tzone = ""), data = c(-0.00183760994446658, 
0.00089738603087497, 0.000423513598318936, 0, -0.00216496690393131, 
-0.00434836817931339, -0.0224199153445617, 0.000583823085470003, 
0.000353088613905206, 0.000470295331234771)), .Names = c("date", 
"data"), row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10" 
), class = "data.frame") 

Quelle est la meilleure façon de tracer cela comme un terrain de bar ggplot qui montrerait la valeur totale par mois (avec le nom du mois comme texte)?

Je peux le faire manuellement en ajoutant un champ mois:

x$month <- format(x$date, format="%B") 
ddply(x, .(month), function(x) sum(x[, "data"])) 

tracer ensuite ceci indépendamment, mais les mois ne sont pas commandés correctement avec cette approche (? Suppose que je dois créer un facteur commandé); Je présume aussi qu'il y a un moyen "plus facile" avec ggplot.

Répondre

12

Je ne suis pas un expert avec des données de séries chronologiques, mais ce code a fonctionné pour moi:

#The binning by month, saving as a date 
x$month <- as.Date(cut(x$date, breaks = "month")) 

#Plotting 
p <- ggplot(x, aes(month, data))+ 
    stat_summary(fun.y = sum, geom = "bar") 

#My suggestions for display 
minmax <- max(abs(x$data)) 

p + geom_hline(y = 0)+ 
    scale_x_date(minor = "month")+ 
    ylim(-minmax, minmax) 
    # or more ggplot2 accurately 
    #+coord_cartesian(ylim = c(-minmax, minmax)) 

Avec mes suggestions, vous finissez par mettre en évidence zéro avec une ligne, et les axes y sont symétriques autour de 0. J'ai changé le quadrillage mineur de l'axe des x en "mois", car la barre de chaque mois s'étendait sur quelques semaines dans chaque direction, ce qui n'est pas significatif pour la façon dont les données sont agrégées.

Éditer: Bien sûr, la plupart de ce code consistait simplement à créer les sommes mensuelles. Si vos données de date sont dans un format de date, les échelles de date sont automatiquement utilisées pour les axes. Pour changer les grandes pauses x et leur format, vous le faites avec scale_x_date()

p + scale_x_date(major = "month", format = "%b") 
#or 
p + scale_x_date(major = "month", format = "%B %Y") 

Voir ?strftime pour plus de détails sur ce que les chaînes de format signifient.