R:rgl.plot3d中的xlim、ylim和zlim无法工作

3
我将尝试使用以下脚本创建一个三维散点图:
d <- read.table(file='myfile.dat', header=F)
plot3d(
    d,
    xlim=c(0,20),
    ylim=c(0,20),
    zlim=c(0,10000),
    xlab='Frequency',
    ylab='Size',
    zlab='Number of subgraphs',
    box=F,
    type='s',
    size=0.5,
    col=d[,1]
)
lines3d(
    d,
    xlim=c(2,20),
    ylim=c(0,20),
    zlim=c(0,10000),
    lwd=2,
    col=d[,1]
)
grid3d(side=c('x', 'y+', 'z'))

现在,出于某些原因,R忽略了我指定的范围限制,使用任意值破坏了我的图表。运行脚本时没有错误提示。有人知道问题出在哪里吗?如果需要,我也可以发布创建的图表图片。数据文件如下:

myfile.dat

11    2    2
NA    NA    NA
10    2    2
NA    NA    NA
13    2    1
NA    NA    NA
15    2    1
NA    NA    NA
5    2    11
5    3    10
5    4    16
5    5    34
5    6    102
5    7    294
5    8    682
5    9    1439
5    10    2646
5    11    3615
5    12    2844
5    13    1394
NA    NA    NA
4    2    10
4    3    4
4    4    4
4    5    10
4    6    38
4    7    132
4    8    396
4    9    976
4    10    2121
4    11    4085
4    12    6261
4    13    6459
4    14    4238
4    15    1394
NA    NA    NA
7    2    3
NA    NA    NA
6    2    2
NA    NA    NA
9    2    8
9    3    6
9    4    4
9    5    5
NA    NA    NA
8    2    4
8    3    10
8    4    22
8    5    52
8    6    126
8    7    264
8    8    478
8    9    729
8    10    943
8    11    754
8    12    382
NA    NA    NA

1
一个可重现的例子(包括数据和代码,演示你所看到的行为)比一张图片更有用。我这么说是因为当我在我的电脑上运行plot3d时,它对xlim等的更改响应良好。 - joran
我猜你的抱怨是lines3d没有遵守你的限制,但既然常规的line函数也不遵守这样的参数,难道你不应该再考虑一下吗?为什么不使用segments3d呢? - IRTFM
@DWin 嗯,那就是我正在使用的代码。我还能提供什么?这就是给我错误的代码。而且,我也将范围提供给了 plot3d。为什么它没有响应呢? - K G
@DWin 我刚刚尝试了不使用lines3d进行绘图。结果相同。x和y的范围都在-20到40之间,这完全不是我想要的。 - K G
@DWin 嗯,显然如果我将类型设置为除了's'之外的任何内容,范围就会被尊重。这真的很奇怪。有人知道这是怎么回事吗? - K G
2个回答

3

帮助页面中的?plot3d说:“请注意,由于rgl目前不支持剪裁,所有点都将被绘制,并且'xlim'、'ylim'和'zlim'只用于增加相应的范围。”因此,您需要在输入阶段限制数据。(如果您只想要位于绘制体积内的特定范围,则需要使用segments3d而不是lines3d。)

d2 <- subset(d,  d[,1]>0 & d[,1] <20 & d[,2]>0 & d[,2] <20  & d[,3]>0 & d[,3]<10000 ])
plot3d(
    d2[, 1:3],  # You can probably use something more meaningful,
    xlim=c(0,20),
    ylim=c(0,20),
    zlim=c(0,10000),
    xlab='Frequency',
    ylab='Size',
    zlab='Number of subgraphs',
    box=F,
    type='s',
    size=0.5,
    col=d[,1]
)

我注意到当范围为c(0,10000)时,点的大小几乎看不见。进一步的实验表明,范围差异很大会导致在将点增大到可以看见时,保持在低边的0范围会带来进一步的困难。如果你让点变得非常大,它们会扩展范围以适应超出x=0或y=0平面的重叠部分。

嗯,请阅读我之前的评论。我并不是试图剪辑数据。数据已经在我指定的范围内了。问题在于,当使用类型“s”时,plot3d似乎会忽略这些范围。结果是绘图太过密集。 - K G
错误,不是的。我说过我没有收到任何错误信息。数据绘制得很好。只是当我使用类型“s”时,轴范围被任意设置。请注意,当我使用其他类型(如“p”)时,范围设置正确。展示我的数据会有帮助吗?尽管我认为这并不重要,因为它已经绘制得很好了。 - K G
我认为包含数据会极大地有所帮助。 - IRTFM
啊,我想这就解释了。这些球太大了,无法绘制,所以它扩展了范围。谢谢。我想我只能使用“p”了。 - K G
你对如何进行缩放有什么建议吗?采用对数刻度不是一个选项,因为它会平滑分布,而保持分布完整非常关键。 - K G
显示剩余3条评论

0
正如DWin所说,lines3d不处理*lim参数。从帮助页面中可以看到,“...材料属性(参见rgl.material),法线和纹理坐标(参见rgl.primitive)。"
因此,请使用其他函数,或者您可以从plot3d调用中检索现有的限制,并在绘图之前使用这些限制来缩放数据?


请查看我上面的评论。谢谢。 - K G

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