Построение временных рядов с метками даты по оси x
Я знаю, что этот вопрос может быть клише, но мне трудно это делать.
Я установил данные в следующем формате:
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 с датой. Код, который я использовал, следующий:
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"))
Ответы
Ответ 1
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"
Ответ 2
Мне нравится использовать ggplot2
для такого рода вещей:
df$Date <- as.Date( df$Date, '%m/%d/%Y')
require(ggplot2)
ggplot( data = df, aes( Date, Visits )) + geom_line()
![enter image description here]()
Ответ 3
В вашем коде много ошибок.
- Вы смешиваете
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)
Ответ 4
Вы можете повернуть даты с помощью обозначений оси взлома с текстом()
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)
Ответ 5
Это возможно в 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")
Ответ 6
Мне нравится 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]()