在R的lattice包中的云图中添加3D abline

4

我想在R中lattice包的云散点图上添加一条3D abline。以下是我的数据子集(3个变量都在0到1之间):

dat <- structure(c(0.413, 0.879, 0.016, 0.631, 0.669, 0.048, 1, 0.004, 0.523, 0.001, 
0.271, 0.306, 0.014, 0.008, 0.001, 0.023, 0.670, 0.027, 0.291, 0.709, 
0.002, 0.003, 0.611, 0.024, 0.580, 0.755, 1, 0.003, 0.038, 0.143, 0.214, 
0.161, 0.008, 0.027, 0.109, 0.026, 0.229, 0.006, 0.377, 0.191, 0.724, 
0.119, 0.203, 0.002, 0.309, 0.011, 0.141, 0.009, 0.340, 0.152, 0.545, 
0.001, 0.217, 0.132, 0.839, 0.052, 0.745, 0.001, 1, 0.273), .Dim = c(20L, 3L))

这是云图:

# cloud plot
trellis.par.set("axis.line", list(col="transparent")) 
cloud(dat[, 1] ~ dat[, 2] + dat[, 3], pch=16, col="darkorange", groups=NULL, cex=0.8, 
    screen=list(z = 30, x = -70, y = 0),
    scales=list(arrows=FALSE, cex=0.6, col="black", font=3, tck=0.6, distance=1) ) 

我想在0,0,0和1,1,1之间添加一条虚线(即对角线)。我知道可以使用"type="l", panel.3d.cloud=panel.3dscatter"将点更改为线,但我无法找到一种方法来使用此方法添加额外的点/线到绘图中。

以下是使用scatterplot3d实现目标的示例:

# scatterplot3d
s3d <- scatterplot3d(dat, type="p", color="darkorange", angle=55, scale.y=0.7,
    pch=16, col.axis="blue", col.grid="lightblue") 

# add line 
s3d$points3d(c(0,1), c(0,1), c(0,1), col="grey", type="l", lty=2)

我希望使用云图来控制观察图表的角度(scatterplot3d不允许我将图表的0,0,0角面向)。感谢任何建议。


不确定为什么这个被“没有展示研究努力”而投票否决 - 我在发帖前刚花了2个小时查看帮助文档和Deepayan的Lattice书籍... - Steve
1个回答

2
这段代码看起来不太优雅,可能也比较脆弱,但是它似乎能够正常运行...
cloud(dat[, 1] ~ dat[, 2] + dat[, 3], pch=16, col="darkorange", 
        groups=NULL, cex=0.8, 
    screen=list(z = 30, x = -70, y = 0),
    scales=list(arrows=FALSE, cex=0.6, col="black", font=3, 
                tck=0.6, distance=1) ,
      panel=function(...) {
        L <- list(...)
        L$x <- L$y <- L$z <- c(0,1)
        L$type <- "l"
        L$col <- "gray"
        L$lty <- 2
        do.call(panel.cloud,L)
        p <- panel.cloud(...)
      })

需要记住的一件事情是,这个方法不会进行隐藏点/线的删除,所以线条要么在所有点的前面,要么在它们后面;在这个(编辑过的)版本中,do.call(panel.cloud,L)首先执行,因此点将遮挡线条而不是反过来。如果您想进行隐藏线条的删除,则我认为rgl是您唯一的选择...非常强大,但界面比较原始。


这似乎非常有效,非常感谢。我会保持开放一段时间,看看是否有其他建议。 - Steve
嗨,本,我注意到你在编辑中指出的问题 - 如果可能的话,我更喜欢该行位于所有点的后面。你提到可以通过切换panel.cloud调用的顺序来实现此操作 - 我应该如何精确更改顺序?如果很明显,请原谅我没有看到。 - Steve
我仍然不明白为什么使用这些参数进行两次连续的panel.cloud调用不起作用。(但它确实没有起作用。) - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接