2013-08-30 8 views
5

utilizzando xyplot dal pacchetto lattice, tracciare una serie temporale su un numero di anni. Vorrei aggiungere un'area ombreggiata per alcuni di questi anni per indicare che questo periodo di tempo era "speciale" (ad esempio la guerra).Come ottenere sfondo ombreggiato in xyplot in R?

Si prega di scusarsi se questo è banale, ma non sono riuscito a capire come farlo, quindi sarei felice se qualcuno potesse darmi una mano o almeno indicarmi la giusta direzione. Penso che il mio problema principale sia che non so davvero come affrontare questo problema. Sono ancora relativamente nuovo a R e in particolare a lattice.

Ecco un esempio minimo:

xyplot(rnorm(100) ~ 1:100, type="l", col="black") 

Nella trama corrispondente, vorrei il colore dello sfondo (da dire x -Valori di 45 fino a 65) dal basso verso l'alto dell'area di tracciato essere ombreggiato, diciamo, grigio chiaro.

Nota che le soluzioni che ho trovato finora usano base grafica e il polygon -funzione, ma l'intenzione è di ombreggiare l'area sotto o al di sopra di una curva, che è diverso da quello che vorrei fare. Non voglio "solo" voler ombreggiare l'area sotto la mia linea, o sopra la mia linea. Invece vorrei ombreggiare l'intero sfondo per un dato intervallo di tempo.

Se qualcuno potesse aiutarmi qui, sarei molto grato!

risposta

8

Vedi ?panel.xblocks nel pacchetto latticeExtra:

library(latticeExtra) 
x <- 1:100 
xyplot(rnorm(100) ~ x, type="l", col="black") + 
     layer_(panel.xblocks(x, x > 20, col = "lightgrey")) 

enter image description here

+0

Sembra piuttosto potente. 'y = x> 45 & y <0' ti mette le bande grigie a sinistra di x = 45, ma solo dove y <0. Penso che tu abbia scelto di usare 'layer_' perché ha un valore predefinito' under = TRUE'? –

+1

Sembrava piuttosto elegante e ggplot2-ish ma in alternativa si poteva usarlo in una funzione convenzionale del pannello: 'xyplot (rnorm (100) ~ x, type =" l ", col =" black ", panel = function (x, ...) {panel.xblocks (x, x> 20, col = "lightgrey"); panel.xyplot (x, ...)}) '. –

3

Prova questa:

xyplot( 
    rnorm(100) ~ 1:100, type="l", col="black", 
    panel=function (x,y,...){ 
    panel.rect(xleft=45, xright=65,ybottom=-3, ytop=3,col="grey") 
    panel.xyplot(x,y,...) 
    } 
) 

La funzione panel.rect() controlla il rettangolo ed è il reticolo equivalente della funzione rect(). Ha una varietà di impostazioni che potresti trovare utili. Si chiama prima e poi viene aggiunto il xyplot(). Hai molti bisogno di giocare un po 'per ottenere i tuoi parametri ybottom e ytop per apparire come ti piacciono.

+0

Wow, grazie ragazzi, che è stato veloce. Le tue soluzioni sicuramente mi aiutano Mi insegnano anche alcune cose nuove, ed è per questo che adoro questo sito! Spero che ad un certo punto nel tempo sarò abbastanza competente per poter contribuire qui da solo! Grazie e buon fine settimana! – coffeinjunky

3
trellis.focus("panel", 1, 1) 
grid.rect(x =.55, , y=.5, w = .2, height=6, 
    gp = gpar(fill = "light grey")) 
trellis.unfocus() 

Questo differisce da @ soluzione johnpaul in un paio di modi (e penso che la sua risposta è meglio). Questo usa il centro della banda X desiderata per il posizionamento in "coordinate native" e calcola la larghezza come "range (xlim)/range (banda)" e modifica un grafico esistente. la funzione grid.rect è la funzione di livello inferiore dei pacchetti di griglia utilizzata da panel.rect. A volte lo trovo utile quando l'integrazione dei pannelli reticolari all'interno del sistema xyplot mi sconfigge.

Problemi correlati