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

Jak*_*icz 2 plot r time-series xts quantmod

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

一般情节

par(mfrow = c(2,1))
plot(1:5, type="l", main = "generic plot")
lines(5:1)
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

我将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")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

出乎意料的是,它会生成两个图。为什么?

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

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

MrF*_*ick 5

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
Run Code Online (Sandbox Code Playgroud)