2011-10-04 15 views
11

El método update de trellis parcelas permite modificar un diagrama de lattice después de la llamada inicial. Pero el comportamiento update es más parecido a reemplazar que anexar. Esto difiere del idioma ggplot2 donde cada nueva capa es aditiva a lo que ya existe. ¿Es posible obtener este comportamiento aditivo usando lattice?¿Es posible actualizar un panel de celosía en R?

Un ejemplo:

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

Ahora quiero añadir panel.text a la trama existente. Usando update de la siguiente manera no funciona:

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

enter image description here

Sé que puedo usar update especificando todas las capas de la función del panel:

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

Esta voluntad trabajo, pero requiere que sepa lo que ya está en el diagrama lattice, o que refactorice mi código de manera bastante sustancial.

Pregunta: ¿Hay alguna manera de agregar al panel existente en update.trellis?

Respuesta

13

Consulte layer del paquete 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 para un consejo útil – Andrie

+0

No es agradable [página latticeExtra introducción] (http (y para la fijación de los 90 desaparecidos en mi código!): //latticeextra.r-forge.r -project.org). – Marek

+1

Interesante a un lado: si también cargas 'ggplot2' en la misma sesión, la función ggplot' layer' ocultará la 'capa' reticular. Así que necesito llamar a esta función como 'LL + latticeExtra :: layer (...)' – Andrie

2

Aquí es una manera de hacerlo sin latticeExtra. Es cierto que es más complicado y difícil que la ruta latticeExtra. Sin embargo, la flexibilidad con este método trellis.focus podría ser más útil en otros contextos.

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 Muy genial, un gran método a tener en cuenta. – Aaron

Cuestiones relacionadas