R语言中调用lines后plot.xts为何生成额外图表?
为什么plot.xts配合lines会生成新图?
这个问题我之前也碰到过,核心原因有两个:一是你给lines()传递了它不支持的参数,二是plot.xts的S3方法和基础绘图系统的行为有差异。
先看你的代码,问题直接出在这一行:
lines(xts(x = 5:1, order.by = 1:5+as.Date("2017-01-01")), main = "plot.xts")
lines.xts(xts包给lines函数实现的专属S3方法)根本不接受main参数。当你传递这个多余参数后,它会被传递到底层绘图逻辑里——而lines.xts在检测到没有可用的当前绘图上下文时,会自动调用plot.xts创建新图,这就直接生成了第二张图。
另外,plot.xts本身会管理独立的绘图环境,默认会重置部分绘图参数,这也可能和你设置的par(mfrow)产生冲突,但最直接的触发点还是那个多余的main参数。
解决方法
只要去掉lines()里的main参数,就能正常实现叠加效果。给你修正后的代码:
library(xts) par(mfrow = c(2,1)) # 先生成xts数据 xts1 <- xts(x = 1:5, order.by = 1:5 + as.Date("2017-01-01")) xts2 <- xts(x = 5:1, order.by = 1:5 + as.Date("2017-01-01")) # 第一张图:plot.xts + lines叠加 plot(xts1, type="l", main = "plot.xts with overlay") lines(xts2) # 只传递xts对象和必要的绘图参数(比如col、lty这类样式参数) # 第二张图验证mfrow设置生效 plot(1:5, type="l", main = "Generic plot comparison")
如果你的实际场景需要叠加多个xts对象,还可以先初始化一个空的绘图框架,再依次叠加内容:
# 初始化空图,仅显示坐标轴和标题 plot(xts1, type="n", main = "Multiple xts overlays") lines(xts1, col="red", lty=1) lines(xts2, col="blue", lty=2)
这样就能实现和基础plot/lines完全一致的叠加效果了。
内容的提问来源于stack exchange,提问作者Jakub Bejnarowicz
相关产品推荐
相关产品推荐

