季度时间序列ts3绘图X轴季度刻度显示异常问题
为季度时间序列图添加正确的季度刻度标签
问题背景
用户拥有如下季度时间序列ts3:
ts3 Qtr1 Qtr2 Qtr3 Qtr4 1996 99.53661 100.00000 1997 99.97004 99.81439 99.83626 99.89607 1998 99.63327 99.67089 99.08486 95.40506 1999 92.33478 90.40498 89.15398 88.45411 2000 88.07940 87.90297 87.83893 87.88825 2001 88.00351 88.16990 88.27630 88.38974 2002 88.53825 88.66707 88.78324 88.85596 2003 88.90146 88.86197 88.75703 88.69979 2004 88.60257 88.44168 88.21923 87.90716 2005 87.51697 87.12123 86.31867 85.77275 2006 84.69936 83.70466 82.70524 82.07538 2007 81.09732 80.31627 80.40409 80.90472 2008 81.25585 81.74333 82.57073 84.78822 2009 85.62749 85.84770 80.41626 80.37309 2010 80.19556 79.87521 77.60659 77.71701 2011 77.53630 77.38652 77.62422 76.96972 2012 76.85396 77.25449 77.66925 77.19131 2013 77.33289 76.16315 76.15370 75.66456 2014 75.79406 73.45276 74.28542 74.18886 2015 74.20661 73.91630 73.80376 74.02166 2016 74.06891 73.37797 73.99337 73.97490 2017 74.03728 74.15334 73.76682 73.75985 2018 73.68989 73.96065 74.33401 73.67997 2019 72.97971 73.04950 73.11735 73.17182 2020 72.35422 69.24294 66.48046 66.81105 2021 65.68547 57.57196 55.00889 56.00235 2022 55.61863 55.86456 55.32120 56.84359 2023 56.59352
使用base::plot(ts3, ylab = "TCI", xlab = "Quarters")绘图时,X轴仅显示2000-2020年的年度刻度,无法展示季度信息。尝试自定义轴的代码无效果:
plot(ts3, ylab = "TCI", xaxt = "n") axis(1, at=seq(1, length(ts3), 1), labels = seq.Date(as.Date("1996-07-01"), as.Date("2023-01-01"), by = "quarter"))
解决方案
方法一:Base R 自定义坐标轴
问题出在axis函数的at参数使用了从1开始的序列,但ts对象的X轴坐标对应的是时间数值(如1996Q3对应1996.5,1996Q4对应1996.75,1997Q1对应1997),而非简单的索引值。正确步骤如下:
- 提取
ts3的时间索引:用time(ts3)获取每个观测对应的时间数值。 - 生成季度标签:用
format(time(ts3), "%Y Q%q")生成类似"1996 Q3"的标签。 - 绘图并自定义轴,调整标签角度避免重叠。
完整代码:
# 提取时间和标签 ts_time <- time(ts3) ts_labels <- format(ts_time, "%Y Q%q") # 绘图,关闭默认X轴 plot(ts3, ylab = "TCI", xlab = "Quarters", xaxt = "n") # 添加自定义X轴,调整标签角度为45度避免重叠 axis(1, at = ts_time, labels = ts_labels, las = 2, cex.axis = 0.7)
las=2让标签垂直显示,避免拥挤;cex.axis=0.7缩小标签字号。- 如果觉得标签过密,可以选择每隔N个季度显示一次,比如每年显示一次:
# 筛选每年第一个季度的时间点和标签 year_starts <- ts_time[cycle(ts3) == 1] year_labels <- format(year_starts, "%Y") axis(1, at = year_starts, labels = year_labels, las = 2)
方法二:使用forecast包快速绘图
forecast包的autoplot函数会自动识别时间序列的频率,默认生成带季度刻度的图表,无需手动调整:
library(forecast) autoplot(ts3, ylab = "TCI", xlab = "Quarters")
内容的提问来源于stack exchange,提问作者Davi Albuquerque
相关产品推荐
相关产品推荐

