繁体   English   中英

带有 x 时间轴的 R 图:如何强制刻度标签为天?

[英]R plot with an x time axis: how to force the ticks labels to be the days?

我有这个 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 轴。 任何的想法? 谢谢

我会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)

在此处输入图片说明

这将起作用:

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)

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

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

在每个月的第一天用不同的格式和对齐方式打勾。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM