Пометьте ось X на графике временных рядов, используя R - PullRequest
11 голосов
/ 04 декабря 2010

Я немного новичок в R и у меня ограниченный опыт построения графиков в целом. Я смог получить свои данные как объект временного ряда в R, используя zoo, но мне трудно, чтобы xaxis был правильно помечен, если это все.

Когда я строю свой зоопарк

plot(z)

На оси х показана только одна метка, 2010 год, когда серия еженедельно охватывает период с апреля 2009 года по октябрь 2010 года.

Я пытался преобразовать мою серию обратно в объект ts и даже в фрейм данных (только один столбец и не включать даты).

Проще говоря, как я могу управлять метками оси x в целом и с объектами временных рядов?

Заранее спасибо!

Ответы [ 5 ]

13 голосов
/ 04 декабря 2010

Начните с примера:

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 имеет множество примеров такого рода вещей.

9 голосов
/ 04 декабря 2010

Маркировка осей не совпадает даже с месячными делениями, но может быть полезна в некоторых ситуациях. Случайные данные (суммированные) за последние 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 голосов
/ 04 декабря 2010

plot.zoo использует функции оси в классической графике R, но Zoo также предлагает решетчатую графику также через 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 для сильно настроенных осей.

1 голос
/ 01 сентября 2015

Я собрал все вышеперечисленное и несколько дополнительных опций в одном месте, для справки:

# 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 голосов
/ 06 апреля 2017

, если время в формате даты, это может быть полезно.

 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...