使用日期标签在 x 轴上绘制时间序列

54

我知道这个问题可能很老套,但我很难做到。

我的数据集格式如下:

    日期            访问量
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"))

2
这是你之前使用的代码吗?它起作用了吗?现在不起作用了吗?出现了什么错误信息? - Spacedman
1
我编写了一个灵活的R脚本实用程序,专门用于这种情况,它可以获取您的时间序列CSV并生成一个漂亮的图形,例如下面所示的图形。在github上获取它:https://github.com/doofdoofsf/plotTimeSeries - user2246801
6个回答

65

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命令。也可以使用xyplot.zoo完成。

library(lattice)
xyplot(z)

或者autoplot.zoo:
library(ggplot2)
autoplot(z)

注意:

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"

26

我喜欢使用 ggplot2 来完成这种任务:

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

这里输入图片描述


9

你的代码出现了很多错误。

  • 你混淆了 dm$Daydm$day,它们可能不是同一个东西。
  • 你的列标题是 DateVisits。因此,你应该将它们访问为(我猜测)dm$Datedm$Visits
  • 在日期字段中,你使用了 %Y-%m-%d ,这应该改为 %m/%d/%Y

以下代码应该绘制出你想要的内容:

dm$newday = as.Date(dm$Date, "%m/%d/%Y")
plot(dm$newday, dm$Visits)

4
您可以通过利用text()函数来修改轴标识来旋转日期。
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)

4

你可以在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")

2
我也喜欢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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接