【问题标题】:R: display values in levelplot stratified by a grouping variableR:在按分组变量分层的 levelplot 中显示值
【发布时间】:2016-03-02 19:00:33
【问题描述】:

在以下示例中,我需要显示按分组变量 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)

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

【问题讨论】:

    标签: r graphics lattice


    【解决方案1】:

    在幕后,lattice 使用一个名为 subscripts 的参数来对数据进行子集化,以便在不同的面板中显示。通常,它会在您不需要注意的情况下这样做,但这不是其中一种情况。

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

    panel.text(),(实际上只是lattice:::ltext.default() 的包装),另一方面,不知道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)
    

    【讨论】:

    • 感谢您非常详细的回答。我已经找到了使用panel.number() 的解决方法,但您的解决方案更优雅。
    • 不客气。这是一个很好的问题,终于让我更好地处理了你什么时候做并且不需要搞乱下标。
    猜你喜欢
    • 2013-04-15
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多