R как создать собственную ось X с датами - PullRequest
2 голосов
/ 19 января 2012

Я пытаюсь построить некоторые цены против дат. Есть около 10 тысяч строк данных. Даты варьируются от ~ 01.07.2008 - 01.12.2011. Я хотел бы иметь возможность создать собственную ось X со следующими галочками для каждый год:

1) в 1/1 есть ГГГГ (т.е. 2011)

2) в 4/1 есть сокращение месяца (т.е. Apr)

3) в 7/1 есть сокращение месяца (т.е. Jul)

4) в 10/1 есть сокращение месяца (т.е. Oct)

Вот описание данных:

> head(as.POSIXct(rs4p[,3]))
[1] "2008-06-30 20:00:00 EDT" "2008-06-30 20:00:00 EDT"
[3] "2008-06-30 20:00:00 EDT" "2008-06-30 20:00:00 EDT"
[5] "2008-06-30 20:00:00 EDT" "2008-06-30 20:00:00 EDT"
> head((rs4p[,3]))
[1] "2008-07-01" "2008-07-01" "2008-07-01" "2008-07-01" "2008-07-01"
[6] "2008-07-01"
> min((rs4p[,3]))
[1] "2008-07-01"
> max((rs4p[,3]))
[1] "2011-12-08"
> class((rs4p[,3]))
[1] "Date"

UPDATE:

Еще одна вещь, которую я забыл, это то, что когда график готов, я бы хотел поставить grid() поверх графика. Есть ли способ сделать линии сетки соответствующими тикам года?

Ответы [ 3 ]

3 голосов
/ 19 января 2012

Винсент получил его первым, но вот моя версия с зоопарком

library(zoo)
my.ts <-zoo(0:1000,as.Date("2000-01-01")+0:1000)
plot(my.ts, xaxt="n")

years <-index(my.ts)[format(index(my.ts),"%m-%d") %in% "01-01"]
other.quarters <- index(my.ts)[ format(index(my.ts), "%m-%d") %in% c("04-01", "07-01","10-01")]
axis.Date(1, at=years, label=format(years,"%y"))
axis.Date(1, at=other.quarters, label=format(other.quarters, "%b"))

enter image description here

ОБНОВЛЕНИЕ: вот как добавить линии сетки:

grid(nx=NA, ny=NULL)
abline(v=c(years, other.quarters),col = "lightgray", lty = "dotted", lwd = par("lwd"))

enter image description here

3 голосов
/ 19 января 2012

Вы можете подавить оси по умолчанию с помощью axes=FALSE и добавить их вручную, вызвав axis.Date.

# Sample data
library(quantmod)
getSymbols( "^DJI" )
x <- DJI

# Plot without the date axis
matplot( 
  index(x), coredata(Ad(x)), 
  axes=FALSE, 
  xlab="", ylab="",
  type="l", lwd=3
)
axis(2, las=1)

# Some date arithmetics
all_days <- seq.Date( from=min(index(x)), to=max(index(x)), by=1 )
months  <- all_days[ format(all_days, "%d") == "01" ]
january <- all_days[ format(all_days, "%m-%d") == "01-01" ]
april   <- all_days[ format(all_days, "%m-%d") == "04-01" ]
july    <- all_days[ format(all_days, "%m-%d") == "07-01" ]
october <- all_days[ format(all_days, "%m-%d") == "10-01" ]

# Finally plot the axes
axis.Date(1, at=months,  label=FALSE, tcl=-.3) 
axis.Date(1, at=january, label=format(january, "%Y"))
axis.Date(1, at=april,   label=format(april,   "%b"))
axis.Date(1, at=july,    label=format(july,    "%b"))
axis.Date(1, at=october, label=format(october, "%b"))

Вы также можете посмотреть на ggplot2: ось по умолчанию для дат редко требуетсяподстройка.

2 голосов
/ 19 января 2012

Винсент опередил меня, но вот как я сделал в основном то же самое:

# Dates you want to have in the year format
fmtasY <- "Jan 01"

# Dates you want to have in the abbreviated month format (%b)
fmtasb <- c("Apr 01", "Jul 01", "Oct 01")

# Some dates
dates <- as.Date(14061:15309, origin = as.Date("1970-01-01"))

# Some intermediate labels for formatting
intermlabs <- format(dates, "%b %d")

# Set up final labels
yourlabs <- NA

# If the date is Jan 01, the label should be %Y
yourlabs[intermlabs %in% fmtasY] <- format(dates[intermlabs %in% fmtasY], "%Y")

# If the date is the first of April, July or October, label with %b
yourlabs[intermlabs %in% fmtasb] <- format(dates[intermlabs %in% fmtasb], "%b")

# Check your work
data.frame(dates, intermlabs, yourlabs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...