1

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

考虑以下RasterStack, s:

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

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

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

在此处输入图像描述

With rasterVis::levelplot,strip 名称是通过names.attr参数传递的,但似乎这些character在最终被传递给之前被强制传递给lattice::levelplotwith strip.custom(factor.levels = names.attr)

结果是:

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

在此处输入图像描述

除了修改源代码之外,有没有办法在带状标签中使用表达式(或以其他方式实现下标/上标字符)rasterVis::levelplot

4

1 回答 1

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

并通过以下方式将非强制表达式传递给“factor.levels” names.attr

png(); print(levelplot(s, names.attr=expression(Something, Something[2])) );dev.off()

在此处输入图像描述

于 2015-10-17T06:05:55.233 回答