R为什么plot.xts会在调用行后创建额外的图形?

时间:2018-01-25 15:03:54

标签: r plot time-series xts quantmod

考虑以下两个图,首先使用通用绘图函数,第二个使用plot.xts:

通用情节

par(mfrow = c(2,1))
plot(1:5, type="l", main = "generic plot")
lines(5:1)

如预期的那样,线条函数会添加到现有图形中,因此它会生成单个图形

enter image description here

我已设置mfrow = c(2,1)来向您显示,只有一个图表。 现在使用xts数据:

par(mfrow = c(2,1))
plot(xts(x = 1:5, order.by = 1:5+as.Date("2017-01-01")), type="l", main = "plot.xts")
lines(xts(x = 5:1, order.by = 1:5+as.Date("2017-01-01")), main = "plot.xts")

enter image description here

意外地导致两个图表。为什么?

我的具体案例有点复杂,但我发现这段代码是重现我的问题的最简单方法。基本上我想继续在一个图上添加xts数据。我能够使用通用绘图和线条功能来实现这一点。

平台信息: R版本3.4.3(2017-11-30) 平台:x86_64-apple-darwin15.6.0(64位) 运行于:macOS High Sierra 10.13.2 quantmod_0.4-12 xts_0.10-1

1 个答案:

答案 0 :(得分:3)

xts绘图功能实际上并不像基本绘图功能那样,尽管它们的调用看起来一样。

plot.xts函数返回一个对象。默认情况下,如果不将对象分配到任何位置,R将“打印”对象,从而导致绘制绘图。 lines.xts函数更改最近的绘图对象并添加新系列。由于未保存绘图,因此也会打印该新对象。这个新对象会记住第一个系列以及新添加的系列。

最好的办法是保存这些对象,只在完成添加图层后打印它们。例如

par(mfrow = c(2,1))
pp <- plot(xts(x = 1:5, order.by = 1:5+as.Date("2017-01-01")), type="l", main = "plot.xts")
pp <- lines(xts(x = 5:1, order.by = 1:5+as.Date("2017-01-01")), main = "plot.xts")
pp #plot will be drawn here