rasterVis::levelplot 个条带标签中的 Subscript/superscript 个字符

Subscript/superscript characters in rasterVis::levelplot strip labels

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

考虑以下 RasterStacks

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

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

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

使用 rasterVis::levelplot,条带名称通过 names.attr 参数传递,但似乎这些名称在最终使用 [= 传递给 lattice::levelplot 之前被强制转换为 character 24=]。

结果是:

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

如果不修改源代码,有没有办法在rasterVis::levelplot的条带标签中使用表达式(或以其他方式实现subscript/superscript个字符)?

您可能认为 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()