是否可以更新R中的晶格面板?

时间:2011-10-04 14:47:23

标签: r plot lattice

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)

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中的现有面板?

2 个答案:

答案 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))

result of code

答案 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))
}

Output of code above