Построение временных рядов с метками даты на оси X - PullRequest
41 голосов
/ 30 января 2011

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

У меня есть данные в следующем формате:

    Date            Visits

    11/1/2010       696537
    11/2/2010       718748
    11/3/2010       799355
    11/4/2010       805800
    11/5/2010       701262
    11/6/2010       531579
    11/7/2010       690068
    11/8/2010       756947
    11/9/2010       718757
    11/10/2010      701768
    11/11/2010      820113
    11/12/2010      645259

Я хочудля создания графика временного ряда, где ось X представляет собой временные и оси Y.Кроме того, я хочу отметить ось X с датой.Я использовал следующий код:

dm$newday = as.POSIXct(strptime(dm$Day, format="%Y-%m-%d"))
plot(as.Date(dm$day),dm$visits)
axis.Date(1,Day,at=seq(as.Date("2010/10/30"), as.Date("2011/01/29"),by="days"))

Ответы [ 6 ]

51 голосов
/ 30 января 2011

1) Поскольку время является датой, обязательно используйте "Date" класс, а не "POSIXct" или "POSIXlt".См. R News 4/1 для получения совета и попробуйте это, где Lines определено в примечании в конце.Здесь не используются никакие пакеты.

dm <- read.table(text = Lines, header = TRUE)
dm$Date <- as.Date(dm$Date, "%m/%d/%Y")
plot(Visits ~ Date, dm, xaxt = "n", type = "l")
axis(1, dm$Date, format(dm$Date, "%b %d"), cex.axis = .7)

Использование text = Lines просто для того, чтобы сохранить пример автономным, и на самом деле он будет заменен чем-то вроде "myfile.dat".(продолжение после изображения)

screenshot

2) Поскольку это временные ряды, вы можете использовать представление временных рядов, даваянемного более простой код:

library(zoo)

z <- read.zoo(text = Lines, header = TRUE, format = "%m/%d/%Y")
plot(z, xaxt = "n")
axis(1, dm$Date, format(dm$Date, "%b %d"), cex.axis = .7)

В зависимости от того, как вы хотите, чтобы график выглядел так, может быть достаточно просто использовать plot(Visits ~ Date, dm) в первом случае или plot(z) во втором случае, подавляя axisКоманда полностью.

Примечание:

Lines <- "Date            Visits
11/1/2010   696537
11/2/2010   718748
11/3/2010   799355
11/4/2010   805800
11/5/2010   701262
11/6/2010   531579
11/7/2010   690068
11/8/2010   756947
11/9/2010   718757
11/10/2010  701768
11/11/2010  820113
11/12/2010  645259"
20 голосов
/ 30 января 2011

Мне нравится использовать ggplot2 для такого рода вещей:

df$Date <- as.Date( df$Date, '%m/%d/%Y')
require(ggplot2)
ggplot( data = df, aes( Date, Visits )) + geom_line() 

enter image description here

7 голосов
/ 30 января 2011

В вашем коде много ошибок.

  • Вы смешиваете dm$Day и dm$day. Вероятно, не то же самое
  • Ваши заголовки столбцов: Date и Visits. Таким образом, вы получите к ним доступ (я предполагаю) как dm$Date и dm$Visits
  • В поле даты у вас есть %Y-%m-%d это должно быть %m/%d/%Y

Следующий код должен отображать то, что вы хотите:

dm$newday = as.Date(dm$Date, "%m/%d/%Y")
plot(dm$newday, dm$Visits)
3 голосов
/ 31 января 2011

Это возможно в ggplot, и вы можете использовать scale_date для этой задачи

 library(ggplot2)  
 Lines <- "Date            Visits
    11/1/2010   696537
    11/2/2010   718748
    11/3/2010   799355
    11/4/2010   805800
    11/5/2010   701262
    11/6/2010   531579
    11/7/2010   690068
    11/8/2010   756947
    11/9/2010   718757
    11/10/2010  701768
    11/11/2010  820113
    11/12/2010  645259"
    dm <- read.table(textConnection(Lines), header = TRUE)
    dm <- mutate(dm, Date = as.Date(dm$Date, "%m/%d/%Y"))
    ggplot(data = dm, aes(Date, Visits)) + 
    geom_line() + 
    scale_x_date(format = "%b %d", major =  "1 day")
3 голосов
/ 31 января 2011

Вы можете повернуть даты, взломав обозначения осей с текстом ()

Lines <- "Date            Visits
11/1/2010   696537
11/2/2010   718748
11/3/2010   799355
11/4/2010   805800
11/5/2010   701262
11/6/2010   531579
11/7/2010   690068
11/8/2010   756947
11/9/2010   718757
11/10/2010  701768
11/11/2010  820113
11/12/2010  645259"

dm <- read.table(textConnection(Lines), header = TRUE)
dm$Date <- as.Date(dm$Date, "%m/%d/%Y")
plot(Visits ~ Date, dm, xaxt = "n", type = "l")
axis(1,at=NULL, labels=F)
text(x = dm$Date, par("usr")[3]*.97, labels = paste(dm$Date,' '), srt = 45, pos = 1, xpd = TRUE,cex=.7)
1 голос
/ 21 августа 2017

Мне тоже нравится ggplot.

Вот один пример:

df1 = data.frame(
date_id = c('2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04'),          
nation = c('China', 'USA', 'China', 'USA'), 
value = c(4.0, 5.0, 6.0, 5.5))

ggplot(df1, aes(date_id, value, group=nation, colour=nation))+geom_line()+xlab(label='dates')+ylab(label='value')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...