web-dev-qa-db-ja.com

Rを使用して時系列プロットでX軸にラベルを付ける

私はRに少し慣れておらず、一般的なプロットの経験は限られています。 Zooを使用してRで時系列オブジェクトとしてデータを取得する作業はできましたが、xaxisに正しくラベルを付けるのに苦労しています。

Zooオブジェクトをプロットすると

plot(z)

X軸には、2010年という1つのラベルのみが表示されます。シリーズが2009年4月から2010年10月まで毎週行われる場合。

シリーズをtsオブジェクト、さらにはデータフレーム(1つの列のみで、日付は含まれていません)に変換しようとしました。

簡単に言うと、x軸ラベルを一般的に、時系列オブジェクトで制御するにはどうすればよいですか?

前もって感謝します!

12
Btibert3

例から始めます。

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この種の例はたくさんあります。

13
Gavin Simpson

軸のラベル付けは、月ごとの分割でも一致しませんが、状況によっては役立つ場合があります。過去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

10
42-

plot.ZooはRのクラシックグラフィックスの軸関数を使用しますが、Zooは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にはさらに例があり、Zooに付属している3つのビネットもあります。それらの場所では、高度にカスタマイズされた軸のplot.Zooと一緒にクラシックグラフィックスのaxis関数を使用する方法を示す別のアプローチの例も見つけることができます。

6
G. Grothendieck

私自身の参考のために、上記のすべてといくつかの追加オプションを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"))
1
Raja

時刻が日付形式の場合、これが役立つ場合があります。

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