11

updateplots方法允许在第一次调用之后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

4

2 回答 2

14

layerlatticeExtra包装上看。

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

代码结果

于 2011-10-04T14:59:41.790 回答
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))
}

上面代码的输出

于 2013-10-29T21:53:36.017 回答