update
图的trellis
方法允许用户在初始调用后修改lattice
图。但update
行为更像是替换而不是追加。这不同于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)
现在我想将panel.text
添加到现有的情节中。以下列方式使用update
不起作用:
update(LL, panel=function(...){
args <- list(...); panel.text(args$x, args$y+2, round(args$y, 0))
})
我知道我可以通过指定面板功能中的所有图层来使用update
:
update(LL, panel=function(...){
args <- list(...)
panel.barchart(...)
panel.text(args$x, args$y+2, round(args$y, 0))
})
这样可行,但要求我知道lattice
图中已有的内容 - 或者我对代码的重构非常重要。
问题:有没有办法添加到update.trellis
中的现有面板?
答案 0 :(得分:14)
请参阅latticeExtra
包中的layer
。
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))
答案 1 :(得分:4)
这是一种没有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))
}