rasterVis :: levelplot条带标签中的下标/上标字符

时间:2015-10-16 22:51:07

标签: r text raster lattice rastervis

我们可以在rasterVis::levelplot条带标签中包含下标/上标字符吗?

考虑以下RasterStacks

library(rasterVis)
s <- stack(replicate(2, raster(matrix(runif(9), 3))))

Raster*对象的默认绘图方法允许将表达式传递给main参数:

plot(s, main=expression(Something, Something[2]))

enter image description here

使用rasterVis::levelplot,条带名称通过names.attr参数传递,但似乎这些名称被强制转移到character,然后最终传递给lattice::levelplot strip.custom(factor.levels = names.attr) }。

结果是:

levelplot(s, names.attr=expression(Something, Something[2]))

enter image description here

如果没有修改源代码,是否可以在rasterVis::levelplot的条带标签中使用表达式(或以其他方式实现下标/上标字符)?

1 个答案:

答案 0 :(得分:2)

您可能认为rasterVis::levelplot正在使用lattice::levelplot的代码,并且事实证明是这种情况,但首先会发生一系列数据转换。使用x =“RasterBrick”的签名无法看到S4方法,而是需要x =“Raster”。

showMethods("levelplot", classes="RasterStack", includeDefs=TRUE)

getMethod("levelplot", signature=c(x="Raster", data="missing"))

这表明构造条带的代码定义为:

    ....
            strip = strip.custom(factor.levels = names.attr), 
    ....

我猜想factor.levels将是传递表达式的正确参数。有一个强制步骤导致失败。因此,您需要破解代码以允许表达式完成。如果我用as.character注释掉强制:

        else {
         # names.attr <- as.character(names.attr)
         if (length(names.attr) != nlayers(object)) 
             stop("Length of names.attr should match number of layers.")

使用:

setMethod( "levelplot:   {
  function code
  },  signature= c(x="Raster", data="missing"))

将两个未导出的函数从rasterVis复制到全局环境中我获得了成功:

drawMargin <- rasterVis:::drawMargin
constructMargin <- rasterVis:::constructMargin

通过names.attr

将未经过表达的表达式传递给'factor.levels'
png(); print(levelplot(s, names.attr=expression(Something, Something[2])) );dev.off()

enter image description here