时序数据可视化的细节处理
使用R语言对较大频度的时序数据(秒级数采数据)进行可视化时,我们在时间轴的细节处理,也就是一般情况下的横坐标轴的自定义上会遇到问题,典型的有两个,一是时间格式的处理,二是坐标轴刻度的处理。
1.时间格式的处理
这个问题之所以会产生的原因是当我们从外部数据源导入数据到R中时,我一般会使用stringsAsFactors=F参数,这样源数据中的字符串就不会当作Factor类型避免后续处理可能出现的麻烦。但时间格式的数据同样也就变成了字符串格式,后续直接处理就是对字符串的处理了,这在数据排序上肯定就出问题了,同样也无法直接计算了。
解决办法:使用时间转换函数(as.POSIXlt()或者as.POSIXct()),关于这两个函数的区别请参看as.POSIXlt() 和 as.POSIXct()。
这里要特别注意是的这两个函数将字符串进行转换后的结果显示几乎是一模一样的,但请用typeof()函数查看结果数据的类型,lt的结果是list,ct的结果是double,这对于后续的plot()画图时可是至关重要的,必须使用double格式的时间格式才可以。
## op定义后续的绘图区域margin留空的距离,顺序是下,左,上,右
## 时间数据x一定要用as.POSIXct()进行转换,且先不定义坐标轴
>op <- par(mar=c(6,4,1,1))
>par(op)
>plot(x,y,type="o",xaxt="n",yaxt="n",bty="n",xlab="",ylab="")
2.坐标轴刻度的处理
这个问题之所以会产生的原因是R并不擅长处理坐标轴,也就是说默认的坐标轴一般都不会是你想要的,包括刻度分配和标签显示。
解决办法:在之前的文章R中自定义坐标轴中有过提及,这里对时间轴再补充说明一下。补充说明主要是针对时间格式的刻度定义,以及较大密度的刻度标签采用45°倾斜显示。
这里要特别注意的是在上面的plot()函数中,我们没有定义坐标轴,因此我们要使用axis()定义坐标轴,在at参数中记住一定也要使用double类型的数据,然后暂不定义labels参数,因为标签会在后续的text()函数中来进行处理。
使用的seq()函数可以在数据处理函数学习记录中温习其用法。
## 注意at参数对时间格式的处理,且先不定义坐标轴标签
>axis(1,at=seq(as.POSIXct("2019-10-22"),as.POSIXct("2019-11-22"),by="day"),labels=FALSE)
##注意text参数
## x代表坐标轴标签显示的横坐标位置,同样是可比较计算的double格式
## y代表坐标轴标签显示的纵坐标位置,使用了一个计算公式,其中0.05的乘数可根据实际位置效果进行调整,目的是将标签位置下移,腾出足够的空间倾斜显示
## labels定义了标签文本,使用as.character()转换为字符串,文本数量与axis()定义的刻度数量一致
## srt,adj定义了文本可调整角度为45°
## xpd定义了标签文本可以显示在整个图像区域内
>text(x=seq(as.POSIXct("2019-10-22"),as.POSIXct("2019-11-22"),by="day"),y=par("usr")[3]-0.05*(par("usr")[4]-par("usr")[3]),labels=as.character(seq(as.POSIXct("2019-10-22"),as.POSIXct("2019-11-22"),by="day")),srt=45,adj=1,xpd=TRUE)
感谢博主分享。我恰好也遇到了这篇文章中的问题,第一点日期数据格式的问题已经克服了。只是第二点坐标轴刻度和标签的自定义方面,我希望指定显示时序中的某8个日期(全部总共不到一年的日期),按照博主的方法写了这部分代码,运行时不会报错,但是最终图上面并没有显示相应的坐标轴刻度和标签,所以想请教一下可能是哪里的问题呢?
Angelina,你好!R中对坐标轴的刻画的确需要不断的调试。方便的话,你可以把自己的代码贴出来,一起探讨一下。