2010-12-04 14 views
11

Ich bin etwas neu zu R und habe begrenzte Erfahrung mit dem Plotten im Allgemeinen. Ich konnte meine Daten als Zeitreihenobjekt in R mit Zoo abrufen, aber es fällt mir schwer, die Xaxis korrekt zu beschriften, wenn alles vorhanden ist.Label X-Achse im Zeitreihen-Diagramm unter Verwendung von R

Als ich

plot(z) 

Die x-Achse meines Zoo Objekt

Plot zeigt nur ein Etikett, das Jahr 2010, wenn die Serie wöchentlich von April Spanning 2009 bis Oktober 2010

ich versuchte, wandle meine Serie zurück in ein ts-Objekt und sogar in einen Datenrahmen (nur eine Spalte und enthält keine Daten).

Einfach, wie kann ich die X-Achsen-Etiketten im Allgemeinen und mit Zeitreihenobjekten steuern?

Vielen Dank im Voraus!

Antwort

13

beginnen mit einem Beispiel:

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

Wenn wir verschiedene Zecken Standorten wollen, können wir die Standardachse unterdrücken Plotten und eigene hinzufügen:

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

Oder sie kombinieren:

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

Sie müssen die Standorte für die Ticks angeben, also wenn Sie monatliche, wöchentliche usw. Werte (statt obs ervations mal oben), müssen Sie die entsprechenden Stellen (Termine) selbst erstellen:

## 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) 

?axis.Date Siehe für weitere Details sowie ?plot.zoo hat viele Beispiele für diese Art der Sache.

+1

Ja. Gavin macht es wieder. Besser als meine Lösung, indem ich den Parameter by = "ways" verwendete, wenn ich einen mit festen Intervallen hatte. Aber da ich Etiketten habe, werde ich sie unverändert veröffentlichen und der OP kann nehmen, was er will. –

8

Die Achsenbeschriftung stimmt nicht mit monatlichen Monatsdivisionen überein, kann jedoch in einigen Situationen nützlich sein. Zufallsdaten (summiert) über die letzten 500 Tage:

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 verwendet die Funktionen der Achse in R klassischen Grafik, aber Zoo bietet auch Gitter Grafiken sowie über xyplot.zoo. Nur plot zu xyplot Ändern kann für Ihre Bedürfnisse ausreichen:

library(zoo) 
library(lattice) 

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

xyplot(z) 

Hinweis, dass es weitere Beispiele in ?plot.zoo und ?xyplot.zoo sowie die drei Vignetten, die mit Zoo kommen. An diesen Stellen finden Sie auch Beispiele für einen anderen Ansatz, der zeigt, wie die axis-Funktion der klassischen Grafik zusammen mit plot.zoo für stark angepasste Achsen verwendet werden kann.

1

ich alle oben und ein paar zusätzliche Optionen an einem Ort, für meine eigene Referenz haben gefangen:

# 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

, wenn die Zeit in Datumsformat ist, kann dies hilfreich sein.

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") 
Verwandte Themen