2010-12-04 7 views
11

Je suis un peu nouveau pour R et j'ai une expérience limitée du traçage en général. J'ai pu travailler à obtenir mes données en tant qu'objet de série temporelle dans R en utilisant zoo, mais j'ai du mal à faire étiqueter correctement les xaxis, si tout est possible.Etiquette Axe X dans le diagramme de série chronologique utilisant R

Quand je conspire mon objet zoo

plot(z) 

L'axe X ne montre une étiquette, l'année 2010. lorsque la série est hebdomadaire allant de Avril 2009 Octobre 2010.

J'ai essayé de convertir ma série en un objet ts, et même un cadre de données (une seule colonne et n'inclut pas les dates).

Simplement, comment puis-je contrôler les étiquettes d'axe x en général, et avec des objets de série temporelle?

Merci d'avance!

Répondre

13

Commencez par un exemple:

x.Date <- as.Date(paste(rep(2003:2004, each = 12), rep(1:12, 2), 1, sep = "-")) 
x <- zoo(rnorm(24), x.Date) 
plot(x) 

Si nous voulons différents endroits de tiques, on peut supprimer l'axe par défaut complotant et ajouter notre propre:

plot(x, xaxt = "n") 
axis(1, at = time(x), labels = FALSE) 

Ou les combiner:

plot(x) 
axis(1, at = time(x), labels = FALSE) 

Vous devez spécifier les emplacements pour les ticks, donc si vous vouliez des valeurs mensuelles, hebdomadaires, etc. (au lieu d'obs fois au-dessus ves), vous devrez créer les endroits pertinents (dates) vous:

## weekly ticks 
plot(x) 
times <- time(x) 
ticks <- seq(times[1], times[length(times)], by = "weeks") 
axis(1, at = ticks, labels = FALSE, tcl = -0.3) 

Voir ?axis.Date pour plus de détails, plus ?plot.zoo a beaucoup d'exemples de ce genre de chose.

+1

Yep. Gavin le fait à nouveau. Mieux que ma solution en vertu de l'utilisation du paramètre by = "weeks" quand j'en avais un avec des intervalles fixes. Mais puisque le mien a des étiquettes je vais l'afficher sans changement et le PO peut prendre ce qu'il veut. –

8

L'étiquetage des axes ne correspond pas aux divisions mensuelles, mais peut être utile dans certaines situations. données aléatoires (résumé) plus 500 derniers jours:

xx.Date <- as.Date((Sys.Date()-500):Sys.Date()) 
x <- zoo(cumsum(rnorm(501)), xx.Date) 
tt=time(x) 
plot(x, xaxt ="n") 
tt <- time(x) 
ix <- seq(1, length(tt), by=60) #every 60 days 
fmt <- "%b-%d" # format for axis labels 
labs <- format(tt[ix], fmt) 
axis(side = 1, at = tt[ix], labels = labs, cex.axis = 0.7) 

enter image description here

6

plot.zoo utilise les fonctions d'axe dans les graphiques classiques de R mais zoo offre également des graphiques en treillis et par xyplot.zoo. Il suffit de changer plot à xyplot peut être suffisant pour vos besoins:

library(zoo) 
library(lattice) 

# create test data 
z <- zooreg(1:83, start = as.Date("2009-04-01"), deltat = 7) 

xyplot(z) 

Notez qu'il existe d'autres exemples dans ?plot.zoo et ?xyplot.zoo ainsi que les trois vignettes qui viennent avec zoo. Dans ces endroits, vous pouvez également trouver des exemples d'une approche différente montrant comment utiliser la fonction axis de graphiques classiques avec plot.zoo pour les axes hautement personnalisés.

1

J'ai capturé tout ce qui précède et quelques options supplémentaires en un seul endroit, pour ma propre référence:

# Time series plots with good X axis labels 
library(zoo) 
# data 
today = Sys.Date() 
dates = as.Date((today-500):today) 
z = zoo (100+cumsum(rnorm(501)), dates) 

# method1 : default X axis labels do not look good 
?plot.zoo 
plot(z) 
?plot.ts 
plot(ts(z)) 

# method 2 : Lattice 
library(lattice) 
?xyplot.zoo 
xyplot(z) 
xyplot(z, lwd=2, col="tomato") 

# method 3 : XTS 
library(xts) 
?plot.xts 
plot(as.xts(z)) 
plot(as.xts(z), auto.grid=F, major.format="%b %y", las=2) 

# method 4 : Base graph 
timeline = time(z) 
summary(timeline) 
index = seq(from=1, to=length(timeline), 90) # put ticks every 90 days 
plot(z, xaxt="n") 
axis(side=1, at=timeline[index], label=format(timeline[index], "%b %y"), cex.axis=0.8) 

# method 5 : ggplot 
library(ggplot2) 
library(scales) 
?date_breaks 
df = data.frame(date=as.POSIXct(time(z)), value=as.numeric(z)) 
head(df) 
# default plot 
ggplot(df, aes(x=date, y=value)) + geom_line() 
# formatted 
ggplot(df, aes(x=date, y=value)) + geom_line() + 
    scale_x_datetime(labels=date_format("%b '%y")) 
# custom breaks 
ggplot(df, aes(x=date, y=value)) + geom_line() + 
    scale_x_datetime(labels=date_format("%b '%y"), breaks=date_breaks("3 months")) 
0

si le temps est au format de date, cela pourrait être utile.

ggplot(data_frame, aes(date,column)) + geom_point() + 
    ggtitle("my title")+ 
    scale_x_date(date_breaks = "1 month",date_labels = "%b") + xlab("month") + 
    ylab("y_axis title") 
Questions connexes