我们可以在rasterVis::levelplot
条带标签中包含下标/上标字符吗?
考虑以下RasterStack
,s
:
library(rasterVis)
s <- stack(replicate(2, raster(matrix(runif(9), 3))))
Raster*
对象的默认绘图方法允许将表达式传递给main
参数:
plot(s, main=expression(Something, Something[2]))
使用rasterVis::levelplot
,条带名称通过names.attr
参数传递,但似乎这些名称被强制转移到character
,然后最终传递给lattice::levelplot
strip.custom(factor.levels = names.attr)
}。
结果是:
levelplot(s, names.attr=expression(Something, Something[2]))
如果没有修改源代码,是否可以在rasterVis::levelplot
的条带标签中使用表达式(或以其他方式实现下标/上标字符)?
答案 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
png(); print(levelplot(s, names.attr=expression(Something, Something[2])) );dev.off()