如何在R与ESS中同时或分窗口显示4个quantmod的lineChart?
如何在R/ESS中同时显示多个quantmod lineChart图表
首先明确说:这不是ESS的特性——不管是在普通R控制台还是ESS里,quantmod的lineChart默认都会覆盖当前的绘图输出,所以你只会看到最后一个图表。这是因为lineChart基于lattice绘图系统,每次调用都会替换当前设备的内容,和编辑器环境无关。
下面给你两种实用的解决方案:
方案1:每次绘图前新建独立窗口
通过dev.new()函数在每个lineChart前创建一个新的绘图窗口,这样每个图表都会在单独窗口显示,不会被覆盖:
library(quantmod) getSymbols("XPT/USD",src="oanda") getSymbols("XAU/USD",src="oanda") # 新建窗口绘制3月黄金图表 dev.new() lineChart(XAUUSD, subset='2018-03::2018-03') # 新建窗口绘制4月黄金图表 dev.new() lineChart(XAUUSD, subset='2018-04::2018-04') # 新建窗口绘制3月铂金图表 dev.new() lineChart(XPTUSD, subset='2018-03::2018-03') # 新建窗口绘制4月铂金图表 dev.new() lineChart(XPTUSD, subset='2018-04::2018-04')
在ESS中,这个方法完全生效——新窗口会正常弹出,你可以切换查看每个图表。如果你的ESS设置了使用内置绘图缓冲区,可能需要先把ess-use-plot-buffer设为nil(在Emacs配置里调整),这样会强制使用外部窗口。
方案2:在同一个窗口排列多个图表
如果你不想开多个窗口,可以把所有图表放在同一个窗口的网格布局里,需要用到gridExtra包:
library(quantmod) library(gridExtra) getSymbols("XPT/USD",src="oanda") getSymbols("XAU/USD",src="oanda") # 将每个图表保存为对象(plot=FALSE不直接绘制) gold_mar <- lineChart(XAUUSD, subset='2018-03::2018-03', plot = FALSE) gold_apr <- lineChart(XAUUSD, subset='2018-04::2018-04', plot = FALSE) platinum_mar <- lineChart(XPTUSD, subset='2018-03::2018-03', plot = FALSE) platinum_apr <- lineChart(XPTUSD, subset='2018-04::2018-04', plot = FALSE) # 2x2网格排列所有图表 grid.arrange(gold_mar, gold_apr, platinum_mar, platinum_apr, ncol = 2)
这种方式会在一个窗口里整齐显示四个图表,不管是ESS还是普通R环境都适用,非常适合对比查看数据。
总结一下:问题的核心是quantmod绘图函数的默认行为,和ESS无关,用上面两种方法就能轻松解决多图表显示的需求。
内容的提问来源于stack exchange,提问作者Bor
相关产品推荐
相关产品推荐

