在下面的示例中,我需要显示按分组变量分层的每个面板中每个单元格的值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)
在幕后,格使用一个称为参数的subscripts
子集来在不同面板中显示数据。通常,它不需要您意识到这一点,但这不是这些情况之一。
通过查看的源代码,可以panel.levelplot
看出它是独立处理subscripts
的。args(panel.levelplot)
表示它在函数的形式参数中,而函数的主体说明了如何使用它们。
panel.text()
,(实际上只是的包装lattice:::ltext.default()
),对却一无所知subscripts
。在panel.text(x,y,z)
对x
,,y
和的调用中,z
看到的是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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句