【问题标题】:R plot with an x time axis: how to force the ticks labels to be the days?带有 x 时间轴的 R 绘图:如何强制刻度标签为天?
【发布时间】:2012-02-21 15:08:57
【问题描述】:

我有这个 csv 格式的文件:

timestamp,pages
2011-12-09T11:20:50.33,4
2012-01-23T17:44:02.71,132
2012-01-28T15:07:59.34,168

第一列是时间戳,第二列是页数。 我需要在纵轴上绘制页数,在横轴上绘制时间戳。

时间戳不规则间隔,我在 12 月有一天,一月有两个关闭日。

我试过这段代码

df = read.csv("my_data.csv")
df$timestamp = strptime(df$timestamp, "%Y-%m-%dT%H:%M:%S")
plot(df$timestamp,df$pages)

我得到了一个图,在 x 轴的中间只有一个刻度,标签为“Jan”:这没有错,但我想要三个刻度,只有日期和月份。

我试过了

plot(df$timestamp,df$pages,xaxt="n")
axis.Date(1,df$timestamp,"days")

但没有绘制 x 轴。 任何想法? 谢谢

【问题讨论】:

    标签: r plot


    【解决方案1】:

    我会像这样as.Date()你的timestamp

    df$timestamp = as.Date(strptime(df$timestamp, "%Y-%m-%dT%H:%M:%S"))
    

    这样就可以了:

    plot(df$timestamp,df$pages,xaxt="n")
    axis.Date(1,at=df$timestamp,labels=format(df$timestamp,"%b-%d"),las=2)
    

    【讨论】:

      【解决方案2】:

      这将起作用:

      plot(df$timestamp,df$pages,xaxt="n")
      axis.POSIXct(1, at=df$timestamp, labels=format(df$timestamp, "%m/%d"))
      

      基本上在 axis.POSIXct(请注意,您的数据框中有 POSIXct 日期)中,您可以指定轴刻度的位置 (at) 以及标签是什么。

      通常我喜欢垂直而不是水平的日期标签。在剧情之前使用par(las=2)

      【讨论】:

        【解决方案3】:

        我发现了这个:http://personality-project.org/r/r.plottingdates.html

        这给了我我的解决方案...

        dm = read.csv("my_data.csv", sep=",", head=TRUE)
        dm$DateTime <- as.POSIXct(dm$timestamp, format="%Y-%m-%dT%H:%M:%S")
        daterange=c(as.POSIXlt(min(dm$DateTime)), as.POSIXlt(max(dm$DateTime)))
        plot(pages ~ DateTime, dm, xaxt = "n")
        axis.POSIXct(1, at=seq(daterange[1], daterange[2], by="day"), format="%b %d")
        

        重要的部分是daterangeat=seq(..., by="day")

        【讨论】:

        • 谢谢,我必须更改您的代码 sn-p 才能获得正确的结果:dm = read.csv("my_data.csv",sep=",",head=TRUE) dm$DateTime &lt;- as.POSIXct(dm$timestamp, format="%Y-%m-%dT%H:%M:%S") daterange=c(as.POSIXlt(min(dm$DateTime)), as.POSIXlt(max(dm$DateTime))) plot(pages ~ DateTime, dm, xaxt = "n") axis.POSIXct(1, at=seq(daterange[1], daterange[2], by="day"), format="%b %d")
        • @uvts_cvs 啊是的,我的日期/时间在不同的列中。会更新。
        【解决方案4】:

        我希望这会有所帮助。我制作了这个函数,允许添加固定数量的等距时间刻度。 通过设置first.day=T,该函数将刻度放在每个月的第一天。 当然,绘图必须使用xaxt="n" 参数创建。 默认情况下,它会添加 10 个刻度 (ticks.n=10),格式为 dd/mm (format.x="%d/%m"),没有月份的第一天,标签为水平方向 (las=1)。

        axis.time=function(time.x=Sys.time(),ticks.n=10,format.x="%d/%m",first.day=F,las=1){
          if (first.day){
            time.x=seq(time.x[1],time.x[length(time.x)],60*60*24/2)
            time.x=time.x[which(diff(as.numeric(format(time.x,"%d")))<0)+1]
          } else {
            time.x=seq(time.x[1],time.x[length(time.x)],length.out=ticks.n)  
          }
          axis.POSIXct(side = 1,x = time.x,at = time.x,format = format.x,las=las)
        }
        

        假设你有一个数据框:

        df1=data.frame(time=seq(Sys.time()-1e8,Sys.time(),length.out = 100),Y=runif(100))

        带有plot(df1) 的绘图将仅在每年年初放置 X 轴刻度。如果您绘制为plot(df1,xaxt="n"),您可以使用axis.time 函数:

        axis.time(time.x = df1$time,first.day = T,las=2,format.x = "%m-%y")

        在每个月的第一天以不同的格式和对齐方式获得一个刻度。

        【讨论】:

        • 你好,可以提供一个使用你的函数的例子吗?
        • 您好,您可以提供一个使用您的函数的示例吗?从df&lt;-data.frame( timestamp=c('2011-12-09T11:20:50.33', '2012-01-23T17:44:02.71', '2012-01-28T15:07:59.34'), pages=c(4,132,168) )开始
        • 我在上面添加了一个例子。在你的情况下,我会设置没有第一天的刻度数:axis.time(time.x = df$timestamp,ticks.n = 10,format.x = "%d-%m")
        • 谢谢。我会把你的 43200 改成不那么神秘的东西 :-) 也许 60*60*24/2?
        猜你喜欢
        • 2012-01-21
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        • 2020-05-29
        • 1970-01-01
        • 2012-07-31
        相关资源
        最近更新 更多