我对R来说有些新手,并且总体上对绘图的经验有限。我已经能够使用zoo将我的数据作为时间序列对象在R中使用,但是我很难正确标记xaxis,如果全部的话。
当我绘制动物园对象时
plot(z)
x轴仅显示一个标签,即2010年。该系列是从2009年4月到2010年10月的每周一次。
我试图将我的系列转换回ts对象,甚至是数据框(只有一列,不包括日期)。
简单地说,我如何控制x轴标签,以及时间序列对象?
提前致谢!
答案 0 :(得分: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)
您需要指定刻度线的位置,因此如果您想要每月,每周等值(而不是上面的观察时间),您需要自己创建相关位置(日期):
## 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 :(得分:9)
轴标记与偶数月份分数不对齐,但在某些情况下可能有用。过去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)
答案 2 :(得分:6)
plot.zoo
使用R的经典图形中的轴函数,但动物园也通过xyplot.zoo
提供点阵图形。只需将plot
更改为xyplot
即可满足您的需求:
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
一起用于高度自定义的轴。
答案 3 :(得分: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"))
答案 4 :(得分: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")