You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:49:33