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

使用getSymbols获取时序数据后绘制散点图的问题与解决

解决zoo/xts对象绘制散点图的问题

嘿,我刚好也碰到过类似的R时间序列绘图坑,来给你拆解一下背后的原因和更灵活的解决办法!

先还原你的操作流程:

  • 用getSymbols("GM")拉取通用汽车的时序数据
  • 取前10行存为hh:hh = GM[1:10]
  • 尝试画前两列散点图时踩了两个坑:
    1. 直接跑plot(hh[,1], hh[,2]),结果出来的是第一列的时序图,完全不是散点图
    2. 换plot.zoo(hh[,1], hh[,2])又报错:Error in xy[, 2] : incorrect number of dimensions
  • 最后通过转向量的方式解决:h1 = drop(coredata(hh[,1]))、h2 = drop(coredata(hh[,2])),再plot(h1, h2)终于得到了散点图

为什么会踩这些坑?

  1. 基础plot函数的自动适配:
    getSymbols默认返回的是zoo/xts类型的时间序列对象,R的基础plot()函数会自动调用针对这类对象的专属绘图方法plot.zoo——而这个方法默认逻辑是绘制时序折线图,哪怕你传了两个参数,它也只会把第一个参数当成要展示的时序数据,直接忽略第二个,所以你看到的是第一列的时序图。

  2. plot.zoo的参数规则:
    plot.zoo如果要画散点图,要求你把两个序列合并成一个多列的zoo对象,再指定绘图类型,而不是分开传两个单列对象。比如你如果写成plot.zoo(hh[,1:2], plot.type = "scatter")其实也能出图,但分开传单列对象的话,它会把第一个参数当成完整数据集,尝试取它的第二列,而单列zoo根本没有第二列,自然就报维度错误了。

除了转向量,还有哪些办法?

你用coredata()+drop()的方法完全没问题,其实还有更简洁的写法:

# 直接把单列转成向量
plot(as.vector(hh[,1]), as.vector(hh[,2]))

如果习惯用ggplot2的话,转成数据框会更直观,还能自定义样式:

library(ggplot2)
# 把zoo对象转成普通数据框
hh_df <- as.data.frame(hh)
ggplot(hh_df, aes(x = GM.Open, y = GM.High)) + 
  geom_point(color = "#2E86AB", size = 2)

内容的提问来源于stack exchange,提问作者Olsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:28:21