2010-12-04 247 views
11

我对R有点新,并且在绘图方面的经验有限。我已经能够将我的数据作为R中使用动物园的时间序列对象来获取,但是我很难将xaxis标记为正确的,如果全部的话。使用R标记X轴在时间序列图中使用R

当我绘制我的动物园对象

plot(z) 

x轴只显示一个标签,2010年时,该系列产品是每周跨越从2009年4月至2010年10月

我试着将我的系列转换回ts对象,甚至是一个数据框(只有一列,不包括日期)。

简而言之,我怎样才能一般地控制x轴标签,并且使用时间序列对象?

在此先感谢!

回答

13

开始用一个例子:

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

如果我们想不同的刻度的位置,就可以抑制默认轴绘制,并添加我们自己:

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

或者将它们组合起来:

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

你需要指定滴答位置,所以如果你想要每月,每周等值(而不是obs ervations倍以上),你需要创建相应位置(日期)自己:

## 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,加上?plot.zoo有很多这样的事情的例子。

+1

是的。加文再次做到这一点。当我有一个固定的时间间隔时,通过使用by =“weeks”参数比我的解决方案更好。但由于我有标签,所以我会将其张贴后保持不变,并且OP可以采取他想要的内容。 – 2010-12-04 18:48:40

8

轴标签并不与每月divs排队,但可能在某些情况下有用。随机数据(总结)在过去的500天数:

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使用轴功能R中的经典图形,但动物园还提供格子图形以及通过xyplot.zoo。只是改变plotxyplot可满足您的需求是足够了:

library(zoo) 
library(lattice) 

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

xyplot(z) 

注意,有在?plot.zoo?xyplot.zoo进一步的例子,以及随之而来的动物园三个护身符。在这些地方,您还可以找到不同方法的示例,演示如何将经典图形的axis功能与plot.zoo一起用于高度定制的轴。

1

我已经捕获所有上述和一些额外的选项,在一个地方,我自己参考:

# 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

如果时间日期格式,这可能会有帮助。

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