rasterVis::levelplot 个条带标签中的 Subscript/superscript 个字符
Subscript/superscript characters in rasterVis::levelplot strip labels
我们可以在 rasterVis::levelplot
个条带标签中包含 subscript/superscript 个字符吗?
考虑以下 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
参数传递,但似乎这些名称在最终使用 [= 传递给 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()
我们可以在 rasterVis::levelplot
个条带标签中包含 subscript/superscript 个字符吗?
考虑以下 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
参数传递,但似乎这些名称在最终使用 [= 传递给 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
:
png(); print(levelplot(s, names.attr=expression(Something, Something[2])) );dev.off()