2011-10-04 9 views
11

Il metodo update dei grafici trellis consente di modificare un grafico lattice dopo la chiamata iniziale. Ma il comportamento update è più simile a sostituire di append. Questo differisce dall'idioma ggplot2 in cui ogni nuovo livello è additivo a ciò che già esiste. È possibile ottenere questo comportamento additivo usando lattice?È possibile aggiornare un pannello reticolare in R?

Un esempio:

LL <- barchart(yield ~ variety | site, data = barley, 
     groups = year, stack = TRUE, 
     between=list(y=0.5), 
     scales = list(x = list(rot = 90))) 
print(LL) 

enter image description here

Ora voglio aggiungere panel.text alla trama esistente. Utilizzando update nel modo seguente non funziona:

update(LL, panel=function(...){ 
      args <- list(...); panel.text(args$x, args$y+2, round(args$y, 0)) 
     }) 

enter image description here

So che posso usare update specificando tutti i livelli nella funzione del pannello:

update(LL, panel=function(...){ 
      args <- list(...) 
      panel.barchart(...) 
      panel.text(args$x, args$y+2, round(args$y, 0)) 
     }) 

Questa volontà lavoro, ma richiede che io conosca ciò che è già nella trama lattice - o che io rappresenti il ​​mio codice in modo abbastanza sostanziale.

Domanda: C'è un modo per aggiungere al pannello esistente in update.trellis?

risposta

13

Vedere layer dal pacchetto latticeExtra.

library(lattice) 
library(latticeExtra) 
LL <- barchart(yield ~ variety | site, data = barley, 
     groups = year, stack = TRUE, 
     between=list(y=0.5), 
     scales = list(x = list(rot = 90))) 
LL + layer(panel.text(x, y, round(y, 0), data=barley)) 

result of code

+0

+1 per un suggerimento utile – Andrie

+0

C'è una bella [pagina di introduzione latticeExtra] (http (e per fissare il mancante 90 nel mio codice!): //latticeextra.r-forge.r -project.org). – Marek

+1

Interessante a parte: se carichi anche 'ggplot2' nella stessa sessione, la funzione' ggplot 'layer' nasconderà il' reticolo 'del reticolo. Quindi ho bisogno di chiamare questa funzione come 'LL + latticeExtra :: layer (...)' – Andrie

2

Ecco un modo per farlo senza latticeExtra. Certo, è più complicato e difficile della rotta latticeExtra. Tuttavia, la flessibilità con questo metodo trellis.focus potrebbe essere più utile in altri contesti.

barchart(yield ~ variety | site, data = barley, 
       groups = year, stack = TRUE, 
       between=list(y=0.5), 
       scales = list(x = list(rot = 90))) 

panels = trellis.currentLayout() 
for(i in seq_along(panels)) { 
    ind = which(panels == i, arr.ind=TRUE) 
    trellis.focus("panel",ind[2],ind[1]) 
    vars = trellis.panelArgs() 
    panel.text(vars$x,vars$y,round(vars$y,0)) 
} 

Output of code above

+0

+1 Molto interessante, un ottimo metodo per essere a conoscenza. – Aaron