R/quantmod: multiple charts all using the same y-a

2020-02-09 05:00发布

I'm trying to plot 6 days of intraday data as 6 charts. Quantmod's experimental chart_Series() function works with par() settings. I've pre-loaded the data into bars (a vector of XTS objects) so my code looks like this:

par(mfrow=c(3,2))   #3 rows, 2 columns

for(d in bars){
    print(chart_Series(d, type = "candlesticks") )
    }

This works, but each chart has its own different y-axis scale. I wanted to set a y-range that covers all 6 days, but cannot find a way to do this. I tried this:

ylim=c(18000,20000)
print(chart_Series(d, type = "candlesticks",ylim=ylim) )

but it fails with the "unused argument(s)" error. yrange=ylim also fails.

I can use chartSeries(d,yrange=ylim), and it works. But as far as I know I cannot put multiple charts in one display (?). (It might strictly be off-subject, but suggestions for alternative R packages that can draw nice-looking candlestick charts, allow y-axis control and can draw multiple charts on one image would also be very welcome.)

2条回答
小情绪 Triste *
2楼-- · 2020-02-09 05:19

Googling to understand Vincent's answer led me to the layout() command. It seems incompatible with par(mfrow), but some more experimentation found it can be used as an alternative.

ylim=c(18000,20000)
layout(matrix(1:12,nrow=6,ncol=2), height=c(4,2,4,2,4,2))
for(d in bars){
    chartSeries(d,layout=NULL,TA=c(addVo(),addBBands()),yrange=ylim)
    }

(You'll notice I added bollinger bands too, to be sure overlays still work too.)

查看更多
地球回转人心会变
3楼-- · 2020-02-09 05:22

With chartSeries, you can set the layout argument to NULL to prevent the layout() command from being called: this is what disables the mfrow setting.

library(quantmod)
getSymbols("AA")

op <- par(mfrow=c(3,2))
for(i in 1:6) {
  chartSeries(
    AA["2011-01"], "candlesticks", 
    TA=NULL, # No volume plot
    layout=NULL, 
    yrange=c(15,18)
  )
}
par(op)

If you want to keep the volume, you can call layout instead of setting mfrow: it does basically the same thing, but allows you to have plots of different sizes and choose the order in which they are plotted.

layout( matrix( c(
    1, 3,
    2, 4,
    5, 7,
    6, 8,
    9, 11,
   10, 12
  ), nc=2, byrow=TRUE),
  heights = rep( c(2,1), 3 )
)
#layout.show(12) # To check that the order is as desired
for(i in 1:6) {
  chartSeries( 
    AA[sprintf("2011-%02d",i)], 
    "candlesticks", layout=NULL, yrange=c(15,19) 
  )
}
查看更多
登录 后发表回答