使用 ggplot2 更改时间序列上的 x 刻度数
Change number of x ticks on time series using ggplot2
我正在尝试绘制一个时间序列 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
似乎没有用。我相信我得到了正确的休息输入,但是,标签现在没有显示。有谁知道为什么?这是情节:
我试图简单地让标签在 x 轴上每 10 个时间戳出现一次(这就是为什么我将中断放入数组中的原因 brks
)。
您的休息时间必须与您的 aes(x=
类型相同,即 scale_x_discrete(breaks=x_output$timestamp[brks])
有效。
但是请注意,像这样将您的时间戳转换为分类时间戳在时间尺度上可能不准确 - 如果时间戳跳过 2 分钟而其余时间戳跳过 1 分钟,这将不会反映在您的图表上。
我认为您最好保留 X 作为日期时间,并使用 + scale_x_datetime(breaks=date_breaks("10 mins"))
。如果您有多个 windows 时间被大量无数据分隔,您可以使用一个变量来指示每行属于哪个 'window',并使用 facet_wrap
绘制 windows并排显示,这样您就可以在保留 x 轴刻度的同时跳过间隙。例如。如果您的数据仅针对特定的 window 每天,您可以 facet_wrap
通过 weekday
。
我正在尝试绘制一个时间序列 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
似乎没有用。我相信我得到了正确的休息输入,但是,标签现在没有显示。有谁知道为什么?这是情节:
我试图简单地让标签在 x 轴上每 10 个时间戳出现一次(这就是为什么我将中断放入数组中的原因 brks
)。
您的休息时间必须与您的 aes(x=
类型相同,即 scale_x_discrete(breaks=x_output$timestamp[brks])
有效。
但是请注意,像这样将您的时间戳转换为分类时间戳在时间尺度上可能不准确 - 如果时间戳跳过 2 分钟而其余时间戳跳过 1 分钟,这将不会反映在您的图表上。
我认为您最好保留 X 作为日期时间,并使用 + scale_x_datetime(breaks=date_breaks("10 mins"))
。如果您有多个 windows 时间被大量无数据分隔,您可以使用一个变量来指示每行属于哪个 'window',并使用 facet_wrap
绘制 windows并排显示,这样您就可以在保留 x 轴刻度的同时跳过间隙。例如。如果您的数据仅针对特定的 window 每天,您可以 facet_wrap
通过 weekday
。