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

4

我正在尝试绘制一个类似这样的时间序列图 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 我试图让标签每10个时间戳出现一次在x轴上(这就是为什么我把分段点放入数组中作为brks)。

最好提供一个可重现的例子 - 在你的数据示例中,所有等待时间都是NA,所以很难为我们制作任何类型的图表。如果更容易的话,只需生成一些虚拟数据即可。 - mathematical.coffee
1个回答

2

你的间断点必须与你的 aes(x= 相同,也就是说,scale_x_discrete(breaks=x_output$timestamp[brks]) 可以工作。

但是要注意,像这样将时间戳转换为类别可能会在时间轴上不准确 - 如果一个时间戳跳过了2分钟,其余的时间跳过了1分钟,这在你的图表中将无法反映出来。

我认为最好保持 X 为日期时间,并使用 + scale_x_datetime(breaks=date_breaks("10 mins"))。如果你有多个时间窗口,它们之间没有数据,你可以使用一个变量来表示每行属于哪个“窗口”,并使用 facet_wrap 将窗口并排绘制,这样可以跳过空白而保留 x 轴比例尺。例如,如果你的数据仅适用于每天的特定时间窗口,则可以使用 facet_wrapweekday 进行分面。


这个可行!谢谢。最后一个问题(我也可以开一个新的问题):你知道如何在ggplot2中为时间戳设置x范围限制吗?它在图表上显示了24小时,但我只需要上午9点到下午6点。我感觉应该是 scale_x_datetime(breaks = date_breaks("1 hour")), limits = c(as.POSIXct("9:00"), as.POSIXct("18:00")) 但我不确定如何仅指定时间而不带日期的时间戳。 - Alex Petralia
date_breaks()已被弃用。现在请使用breaks_width()。 - Branko

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