Размещение сетки вдоль отметок даты - PullRequest
5 голосов
/ 03 февраля 2012

У меня есть следующие данные:

x=strptime(20010101:20010110)
y=1:10
z=data.frame(x,y)

Итак, мои данные таковы:

            x  y
1  2001-01-01  1
2  2001-01-02  2
3  2001-01-03  3
4  2001-01-04  4
5  2001-01-05  5
6  2001-01-06  6
7  2001-01-07  7
8  2001-01-08  8
9  2001-01-09  9
10 2001-01-10 10

Когда я создаю сюжет в базе, используя:

plot(x,y)
grid(NULL,NULL)

Моя вертикальная сетка не совпадает с отметками даты. Я знаю, что это кажется довольно простой проблемой, но я нигде не нашел решения этой проблемы. Есть ли способ заставить вертикальную сетку совпадать с отметками даты, используя базу, которая не требует от меня этого:

abline(v=as.numeric(strptime(c(20010102,20010104,20010106,20010108,20010110),'%Y%m%d')))

У меня много графиков с разными датами, и я действительно хотел бы максимально автоматизировать это, надеюсь, используя base.

Ответы [ 4 ]

6 голосов
/ 03 февраля 2012

Функция axis рисует ваши оси, метки и метки и возвращает позиции меток в виде вектора.

Поскольку у вас есть Date данные, вам нужно использовать axis.Date, чтобы сделать это, а затем использовать abline для построения сетки:

z=data.frame(
  x=seq(as.Date("2001-01-01"), by="+1 month", length.out=10)
  y=1:10
)
plot(y~x, data=z)
abline(v=axis.Date(1, z$x), col="grey80")

enter image description here

3 голосов
/ 03 февраля 2012

abline может извлечь отметки даты из вашего вектора POSIXlt (через strptime).

x=strptime(20010101:20010110,format="%Y%m%d")
y=1:10

plot(x,y)
grid(nx=NA, ny=NULL)
abline(v=axis.POSIXct(1, x=pretty(x)),col = "lightgray", lty = "dotted", lwd = par("lwd"))

Я бы предложил создать собственную функцию, которая бы добавляла как горизонтальные, так и вертикальные сетки.

my.grid <-function(){
grid(nx=NA, ny=NULL)
abline(v=axis.POSIXct(1, x=pretty(x)),col = "lightgray", lty = "dotted", lwd =
par("lwd"))
}

plot(x,y)
my.grid()
3 голосов
/ 03 февраля 2012

Как сказано в файле справки ?grid, «если требуется более тонкая настройка, [вы можете] использовать abline(h = ., v = .) напрямую».Это немного больше работы, но не много, и было бы достаточно легко обернуть в функцию, если вы хотите использовать ее часто.

Вот один из способов сделать это:

plot(x,y)
abline(v = pretty(extendrange(z$x)), 
       h = pretty(extendrange(z$y)),
       col = 'lightgrey', lty = "dotted")
points(x,y, pch=16)

enter image description here

1 голос
/ 03 февраля 2012

Я не знаком с тонкостями базовых сюжетов. Но ggplot делает это эффективно.

x <- strptime(20010101:20010110, format='%Y%m%d')
y <- 1:10
z <- data.frame(x, y)
qplot(x,y,data=z,'point')
...