R绘图中使用时间轴X轴:如何强制刻度标签为日期?

15

我有一个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月的一天和1月的两天非常接近。
我尝试了这段代码:

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轴。 有什么想法吗? 谢谢

4个回答

14
我建议您将 timestamp 使用 as.Date() 进行转换,示例如下:
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)

enter image description here


13

这将起作用:

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)


6
我发现了这个链接: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")

谢谢,为了得到正确的结果,我不得不更改您的代码片段: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") - Alessandro Jacopson
1
@uvts_cvs 噢,是的,我的日期/时间在不同的列中。我会进行更新。 - jozxyqk

2
我希望这可以帮到你。我编写了一个函数,允许添加固定数量的等距时间刻度。 通过设置 first="month",该函数将刻度放置在每个月的第一天。如果 first="day",则该函数将刻度放置在每天的00:00小时。 当然,绘图必须使用 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="none",las=1){
  tz=attr(time.x,"tzone")
  if (first == "day"){
    time.x=seq(time.x[1],time.x[length(time.x)],60*30)
    time.x=time.x[which(diff(as.numeric(format(time.x,"%H")))<0)+1]
    time.x=strptime(as.character(as.Date(time.x)),"%Y-%m-%d",tz)
  } else if (first == "month") {
    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]
    time.x=strptime(as.character(as.Date(time.x)),"%Y-%m-%d",tz)
  } 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 = "month",las=2,format.x = "%m-%y")

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

enter image description here


你好,能否提供一下你的函数使用示例? - Alessandro Jacopson
你好,能否提供一下你的函数使用示例?从 df<-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) ) 开始。 - Alessandro Jacopson
我已经添加了一个示例。在您的情况下,我会设置没有月初的刻度数:axis.time(time.x = df$timestamp,ticks.n = 10,format.x = "%d-%m") - Giancarlo Tamburello
1
谢谢。我会把你的“43200”改成更易懂的东西 :-) 也许是“606024/2”? - Alessandro Jacopson

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