2011-01-30 5 views
36

Я знаю, что этот вопрос может быть клише, но мне трудно это делать.Построение временных рядов с метками даты по оси 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 

Я хочу, чтобы создать временной ряд участок, с осью х представления времени & оси Y vists. Кроме того, я хочу пометить ось 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")) 
+2

Вот код, который вы использовали,? Это сработало? Не работает ли это сейчас? Что сообщение об ошибке? – Spacedman

+1

Я написал гибкую утилиту Rscript для именно этого прецедента, взяв ваш временный ряд CSV и сделав хороший граф, например. показанном ниже. Получите его на github: https://github.com/doofdoofsf/plotTimeSeries – user2246801

ответ

6

В вашем коде имеется множество ошибок.

  • Вы смешиваете 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) 
38

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" 
18

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

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

enter image description here

2

Вы можете вращать даты взламывая оси нотации с текстом ()

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) 
2

Это возможно в 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") 
-1

Мне нравится 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