Возможно ли обновить решетчатую панель в R?

Метод update графиков trellis позволяет изменять график lattice после начального вызова. Но поведение update больше похоже на замену, чем на append. Это отличается от идиомы ggplot2, где каждый новый слой является аддитивным к тому, что уже существует. Возможно ли получить это аддитивное поведение с помощью lattice?

Пример:

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

Теперь я хочу добавить panel.text к существующему сюжету. Использование update следующим образом не работает:

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

enter image description here

Я знаю, что я могу использовать update, указав все слои в функции панели:

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

Это будет работать, но требует, чтобы я знал, что уже находится в графике lattice, или что я реорганизую свой код довольно существенно.

Вопрос: Есть ли способ добавить к существующей панели в update.trellis?

Ответ 1

См. layer в пакете 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

Ответ 2

Вот способ сделать это без latticeExtra. По общему признанию, это сложнее и сложнее, чем маршрут latticeExtra. Однако гибкость с помощью этого метода trellis.focus может быть более полезна в других контекстах.

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