2012-01-11 5 views
8

Sto provando a tracciare 6 giorni di dati intraday come 6 grafici. La funzione sperimentale chart_Series() di Quantmod funziona con le impostazioni par(). Ho pre-caricato i dati in bars (un vettore di oggetti XTS) quindi il mio codice è simile al seguente:R/quantmod: più grafici tutti utilizzando lo stesso asse Y

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

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

questo funziona, ma ogni grafico ha una propria scala di asse y diverso. Volevo impostare un intervallo y che copra tutti i 6 giorni, ma non riesco a trovare un modo per farlo. Ho provato questo:

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

ma non riesce con l'errore "argomento inutilizzato (s)". yrange = ylim fallisce anche.

Posso usare chartSeries (d, yrange = ylim) e funziona. Ma per quanto ne so non posso mettere più grafici in un display (?). (Potrebbe essere rigorosamente fuori tema, ma i suggerimenti per pacchetti R alternativi che possono disegnare grafici candlestick dall'aspetto gradevole, consentire il controllo dell'asse y e disegnare più grafici su un'immagine saranno anch'essi molto graditi.)

risposta

8

Con chartSeries, è possibile impostare l'argomento layout su NULL per impedire che venga chiamato il comando layout(): questo è ciò che disabilita l'impostazione mfrow.

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) 

Se si desidera mantenere il volume, è possibile chiamare layout invece di impostare mfrow: lo fa fondamentalmente la stessa cosa, ma consente di avere appezzamenti di dimensioni diverse e scegliere l'ordine in cui sono tracciate.

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) 
) 
} 
+0

Grazie Vincent, che funziona! Qualche suggerimento/link/articolo su come utilizzare il layout per riportare la sottotabella del volume? –

+1

Ho aggiunto un esempio con 'layout' (prima di vedere la tua risposta ...) –

1

Googling per capire la risposta di Vincent mi ha portato al comando layout(). Sembra incompatibile con par (mfrow), ma alcuni altri esperimenti hanno trovato che può essere utilizzato in alternativa.

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

(noterete ho aggiunto le bande di Bollinger troppo, per essere sicuri che le sovrapposizioni funzionano ancora troppo.)