使用ts.plot绘制每日时间序列时自定义X轴无法显示的问题求助
ts.plot绘制每日时间序列时自定义X轴无法显示的问题求助
嘿,我来帮你排查下这个问题!
你遇到的核心问题是:用plot.ts(你问题里提到的ts.plot其实代码里用的是plot.ts,原理是一致的)绘图时,自定义X轴没显示出来,根源在于你计算的刻度位置和ts对象实际的X轴坐标完全不匹配。
具体来说,你用frequency=365创建的ts对象,它的X轴坐标并不是从1开始的整数——而是以年份+小数的形式来标记时间的:比如2023年1月1日对应的是2023 + 1/365,12月31日对应的是2023 + 365/365 = 2024。但你计算x_indices的时候用了seq(1, length(ts_msft), ...),这组数值完全不在plot.ts生成的X轴范围内,所以自定义的刻度根本落在了绘图区域之外,自然就看不到了。
给你两个实用的解决办法:
方法一:修正ts对象的X轴坐标计算
直接把你的日期转换成ts对象对应的年份小数格式,替换掉原来的x_indices计算逻辑就行:
library(quantmod) getSymbols("MSFT", src = "yahoo", from = "2023-01-01", to = "2023-12-31") msft_prices <- as.numeric(Cl(MSFT)) ts_msft <- ts(msft_prices, frequency = 365, start = c(2023, 1)) plot.ts(ts_msft, ylab = "stock price", xlab = "days", xaxt = "n") date_labels <- seq(as.Date("2023-01-01"), by = "1 month", length.out = 12) # 重点:把日期转换成ts对象对应的年份小数坐标 x_indices <- 2023 + (as.numeric(date_labels - as.Date("2023-01-01")) + 1)/365 axis(1, at = x_indices, labels = format(date_labels, "%b %d"), las = 2)
方法二:直接用日期类型绘图(更推荐)
其实对于日度时间序列,完全没必要用ts对象绕一圈,直接用原始日期作为X轴绘图更直观,还不用手动计算复杂的坐标:
library(quantmod) getSymbols("MSFT", src = "yahoo", from = "2023-01-01", to = "2023-12-31") msft_prices <- as.numeric(Cl(MSFT)) dates <- seq(as.Date("2023-01-01"), to = as.Date("2023-12-31"), by = "day") # 直接用基础plot函数,指定type="l"画折线图 plot(dates, msft_prices, ylab = "stock price", xlab = "days", xaxt = "n", type = "l") date_labels <- seq(as.Date("2023-01-01"), by = "1 month", length.out = 12) axis(1, at = date_labels, labels = format(date_labels, "%b %d"), las = 2)
这个方法里,axis可以直接识别日期类型的刻度位置,不用手动换算,出错概率低很多。
备注:内容来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

