簡體   English   中英

使用R在時間序列圖中標記X軸

[英]Label X Axis in Time Series Plot using R

我對R來說有些新手,並且在繪圖方面經驗有限。 我已經能夠使用動物園將我的數據作為時間序列對象在R中使用,但是我很難正確標記xaxis,如果全部的話。

當我繪制我的動物園對象時

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)

您需要指定刻度線的位置,因此如果您想要每月,每周等值(而不是上面的觀察時間),您需要自己創建相關位置(日期):

## 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有很多此類事例。

軸標記與偶數月份分數不對齊,但在某些情況下可能有用。 過去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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM