使用ggplot2更改时间序列上的x刻度数

时间:2015-07-15 21:43:19

标签: r ggplot2 time-series graphing

我试图绘制一个如下所示的时间序列x_output

              timestamp   city wait_time weekday     time
    2015-07-14 09:00:00 Boston       1.6 Tuesday 09:00:00
    2015-07-14 09:01:00 Boston       1.8 Tuesday 09:00:00
    2015-07-14 09:02:00 Boston       2.4 Tuesday 09:00:00
    2015-07-14 09:03:00 Boston       2.9 Tuesday 09:00:00
    2015-07-14 09:04:00 Boston       4.5 Tuesday 09:00:00
    2015-07-14 09:05:00 Boston       5.6 Tuesday 09:00:00

以下是我如何策划它:

brks <- seq(1, length(x_output$timestamp), 10)
brks_labels <- x_output[brks, ]

p <- ggplot(x_output, aes(x=as.character(timestamp), y=wait_time, group=city)) + geom_line(aes(color=city), size=1.5) + theme(axis.text.x = element_text(angle = 90, hjust=1), legend.position = "bottom") + labs(x=NULL, y="Waiting time (minutes)") + scale_x_discrete(breaks = brks, labels = brks_labels)
print(p)

我必须使用x_output$timestamp作为字符(即分类变量),否则,ggplot2会认为它是连续的并包含没有值的白色空白区域。

但出于某种原因,scale_x_discrete似乎无法正常工作。我相信我得到了休息的输入,但是,标签现在还没有显示出来。有谁知道为什么?这是什么情节:

enter image description here

我试图简单地在x轴上每10个时间戳出现一次标签(这就是为什么我把这些断点放在一个数组中brks)。

1 个答案:

答案 0 :(得分:1)

您的休息时间必须与aes(x=相同,即scale_x_discrete(breaks=x_output$timestamp[brks])有效。

但请注意,将时间戳转换为类似的分类在时间刻度上可能不准确 - 如果时间戳跳过2分钟而其余时间跳过1则不会反映在图表上。

我认为您最好将X保留为日期时间,并使用+ scale_x_datetime(breaks=date_breaks("10 mins"))。如果您有多个时间窗口被大量无数据分隔,您可以使用变量来指示哪个窗口&#39;每行属于,facet_wrap并排绘制窗口,这样可以在保留x轴刻度的同时跳过间隙。例如。如果您的数据仅适用于每天的特定窗口,则可以facet_wrap weekday