使用getSymbols获取时序数据后绘制散点图的问题与解决
解决zoo/xts对象绘制散点图的问题
嘿,我刚好也碰到过类似的R时间序列绘图坑,来给你拆解一下背后的原因和更灵活的解决办法!
先还原你的操作流程:
- 用
getSymbols("GM")拉取通用汽车的时序数据 - 取前10行存为
hh:hh = GM[1:10] - 尝试画前两列散点图时踩了两个坑:
- 直接跑
plot(hh[,1], hh[,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)终于得到了散点图
为什么会踩这些坑?
基础plot函数的自动适配:
getSymbols默认返回的是zoo/xts类型的时间序列对象,R的基础plot()函数会自动调用针对这类对象的专属绘图方法plot.zoo——而这个方法默认逻辑是绘制时序折线图,哪怕你传了两个参数,它也只会把第一个参数当成要展示的时序数据,直接忽略第二个,所以你看到的是第一列的时序图。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
相关产品推荐
相关产品推荐

