Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

r

charts

quantmod

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.)

like image 695
Darren Cook Avatar asked Jan 11 '12 07:01

Darren Cook


2 Answers

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) 
  )
}
like image 106
Vincent Zoonekynd Avatar answered Nov 03 '22 01:11

Vincent Zoonekynd


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.)

like image 25
Darren Cook Avatar answered Nov 03 '22 01:11

Darren Cook