【问题标题】:Plotting time-series with Date labels on x-axis在 x 轴上绘制带有日期标签的时间序列
【发布时间】:2011-06-18 03:44:10
【问题描述】:

我知道这个问题可能是陈词滥调,但我很难做到。

我的数据集格式如下:

日期访问 2010 年 11 月 1 日 696537 2010 年 11 月 2 日 718748 2010 年 11 月 3 日 799355 2010 年 11 月 4 日 805800 2010 年 11 月 5 日 701262 2010 年 11 月 6 日 531579 2010 年 11 月 7 日 690068 2010 年 11 月 8 日 756947 2010 年 11 月 9 日 718757 2010 年 11 月 10 日 701768 2010 年 11 月 11 日 820113 2010 年 11 月 12 日 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"))

【问题讨论】:

  • 那是您使用的代码?它奏效了吗?现在不行吗?错误信息是什么?
  • 我为这个用例编写了一个灵活的 Rscript 实用程序,将您的时间序列 CSV 并制作了一个漂亮的图表,例如如下图所示。在github上获取:github.com/doofdoofsf/plotTimeSeries

标签: r plot


【解决方案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" 的内容。 (上图后续)

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"

【讨论】:

    【解决方案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')
    

    【讨论】:

      【解决方案3】:

      在 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")
      

      【讨论】:

        【解决方案4】:

        我喜欢使用ggplot2 来处理这类事情:

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

        【讨论】:

          【解决方案5】:

          您的代码有很多错误。

          • 您混淆了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)
          

          【讨论】:

            【解决方案6】:

            您可以通过使用 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)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-11-05
              • 1970-01-01
              • 2021-10-14
              • 1970-01-01
              • 1970-01-01
              • 2014-06-02
              • 1970-01-01
              • 2019-04-22
              相关资源
              最近更新 更多