R:在按分组变量分层的水平图中显示值

R: display values in levelplot stratified by a grouping variable

在下面的示例中,我需要显示按分组变量 class:

分层的每个面板中每个单元格的值
library("lattice")
x <- seq(pi/4, 5*pi, length.out=5)
y <- seq(pi/4, 5*pi, length.out=5)
r1 <- as.vector(sqrt(outer(x^2, y^2, "+")))
r2 <- as.vector(sqrt(outer(x^2, y^2, "/")))

grid1 <- grid2 <- expand.grid(x=x, y=y)
grid1$z <- cos(r1^2)*exp(-r1/(pi^3))
grid2$z <- cos(r2^2)*exp(-r2/(pi^3))
grid <- rbind(grid1, grid2)
grid$class <- c(rep("addition",length(x)^2), rep("division", length(x)^2))

p <- levelplot(z~x*y | factor(class), grid, 
               panel=function(...) {
                 arg <- list(...)
                 panel.levelplot(...)
                 panel.text(arg$x, arg$y, round(arg$z,1))})
print(p)

但是,单元格值相互叠加,因为面板选项没有区分两组。如何让值在每个组中正确显示?

稍微在幕后,lattice 使用一个名为 subscripts 的参数对数据进行子集化以在不同的面板中显示。通常,它会在您不知情的情况下执行此操作,但这不是其中一种情况。

查看 panel.levelplot 的源代码会发现它自己处理 subscriptsargs(panel.levelplot) 显示它在函数的形式参数中,函数的主体显示它如何使用它们。

panel.text(),(实际上只是 lattice:::ltext.default() 的包装器),另一方面,它不知道 subscripts 或对 subscripts 做任何事情。在对 panel.text(x,y,z) 的调用中,看到的 xyz 是 data.frame grid 的完整列,这就是为什么你看到了你所做的过度绘制。

要为属于当前面板的值绘制文本,您需要明确使用 subscripts 参数,如下所示:

myPanel <- function(x, y, z, ..., subscripts=subscripts) {
    panel.levelplot(x=x, y=y, z=z, ..., subscripts=subscripts)        
    panel.text(x = x[subscripts], 
               y = y[subscripts], 
               labels = round(z[subscripts], 1))
}
p <- levelplot(z~x*y | factor(class), grid, panel = myPanel)
print(p)