我對R有點新,並且在繪圖方面的經驗有限。我已經能夠將我的數據作爲R中使用動物園的時間序列對象來獲取,但是我很難將xaxis標記爲正確的,如果全部的話。使用R標記X軸在時間序列圖中使用R
當我繪製我的動物園對象
plot(z)
x軸只顯示一個標籤,2010年時,該系列產品是每週跨越從2009年4月至2010年10月
我試着將我的系列轉換回ts對象,甚至是一個數據框(只有一列,不包括日期)。
簡而言之,我怎樣才能一般地控制x軸標籤,並且使用時間序列對象?
在此先感謝!
我對R有點新,並且在繪圖方面的經驗有限。我已經能夠將我的數據作爲R中使用動物園的時間序列對象來獲取,但是我很難將xaxis標記爲正確的,如果全部的話。使用R標記X軸在時間序列圖中使用R
當我繪製我的動物園對象
plot(z)
x軸只顯示一個標籤,2010年時,該系列產品是每週跨越從2009年4月至2010年10月
我試着將我的系列轉換回ts對象,甚至是一個數據框(只有一列,不包括日期)。
簡而言之,我怎樣才能一般地控制x軸標籤,並且使用時間序列對象?
在此先感謝!
開始用一個例子:
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
有很多這樣的事情的例子。
軸標籤並不與每月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)
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
一起用於高度定製的軸。
我已經捕獲所有上述和一些額外的選項,在一個地方,我自己參考:
# 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"))
如果時間日期格式,這可能會有幫助。
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")
是的。加文再次做到這一點。當我有一個固定的時間間隔時,通過使用by =「weeks」參數比我的解決方案更好。但由於我有標籤,所以我會將其張貼後保持不變,並且OP可以採取他想要的內容。 – 2010-12-04 18:48:40