Возможно ли обновить решетчатую панель в 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]()