2010-12-04 58 views
11

Soy un poco nuevo en R y tengo una experiencia limitada en el trazado en general. He podido trabajar para obtener mis datos como un objeto de serie temporal en R usando zoológico, pero me está resultando difícil etiquetar el xaxis correctamente, si es que lo tengo todo.Etiqueta Eje X en serie de tiempo Trazado usando R

Cuando trazo mi zoológico objeto

plot(z) 

El eje x muestra sólo una etiqueta, para el año 2010 cuando la serie es semanal que abarca desde abril de 2009 hasta octubre de 2010.

Intenté convertir mi serie a un objeto ts, e incluso un marco de datos (solo una columna y no incluye las fechas).

Simplemente, ¿cómo puedo controlar las etiquetas del eje X en general, y con los objetos de series de tiempo?

¡Gracias de antemano!

Respuesta

13

de inicio con un ejemplo:

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 queremos diferentes lugares de garrapatas, podemos suprimir el eje por defecto de trazado y añadir nuestra propia:

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

o combinarlos:

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

Debe especificar las ubicaciones para los tics, por lo que si desea valores mensuales, semanales, etc. (en lugar de obs ervations veces más arriba), se deberán crear las ubicaciones relevantes (fechas) usted mismo:

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

Ver ?axis.Date para más detalles, más ?plot.zoo tiene un montón de ejemplos de este tipo de cosas.

+1

Yep. Gavin lo hace de nuevo. Mejor que mi solución en virtud del uso del parámetro by = "semanas" cuando tuve uno con intervalos fijos. Pero como la mía tiene etiquetas, la voy a publicar sin cambios y el OP puede tomar lo que quiera. –

8

El etiquetado de ejes no se alinea incluso con las divisiones mensuales, pero puede ser útil en algunas situaciones. datos aleatorios (sumado) durante los últimos 500 días:

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 utiliza las funciones de eje en los gráficos clásicos de R pero zoológico también ofrece gráficos de celosía, así través xyplot.zoo. Simplemente cambiar plot a xyplot puede ser suficiente para sus necesidades:

library(zoo) 
library(lattice) 

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

xyplot(z) 

Tenga en cuenta que existen otros ejemplos en ?plot.zoo y ?xyplot.zoo, así como las tres viñetas que vienen con zoológico. En esos lugares también puede encontrar ejemplos de un enfoque diferente que muestra cómo usar la función axis de gráficos clásicos junto con plot.zoo para ejes altamente personalizados.

1

he capturado todo lo anterior y un par de opciones adicionales en un solo lugar, para mi propia referencia:

# 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 el tiempo está en formato de fecha, esto podría ser muy útil.

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") 
Cuestiones relacionadas