在 rgl R 包的 plot3d 函数生成的 3D 图上轻松区分众多组

Make numerous groups easily distinguishable on 3D plot produced by plot3d function of rgl R package

我有 23 个不同的组,每个组由 7 到 20 个单独的样本(总共大约 350-400 个观察值)组成,它们具有自己的 x、y 和 z 坐标。我想通过 rgl R 包的 plot3d 函数根据我拥有的数据生成 3D 图。一般来说,这没什么大不了的。问题是,我想让上面提到的 23 个组中的每个组在 3D 图上都易于区分。我尝试为每个组使用不同的颜色,但不幸的是,不可能找到人眼可以很好识别的 23 种颜色。我在考虑 pch 参数,就像在基础 R 库的 plot 函数中一样。但是,正如我所见, plot3d 函数中没有这样的选项。此外,我必须解释一下,我的数据集中有太多点并且为每个点添加标签(例如使用 text3d rgl 函数)不是一个好主意(它们会相互重叠并让步在 3D 图上导致某种混乱)。有没有办法弄清楚(我想这是很常见的问题)?提前致谢!
下面是一些玩具示例的代码,以便更好地解释:

# generate data

prefix=rep("ID",69)
suffix=rep(1:23,3)
suffix_2=as.character(suffix[order(suffix)])
titles_1=paste(prefix,suffix,sep="_")
titles_2=titles_1[order(titles_1)]
x=1:69
y=x+20
z=x+50
df=data.frame(titles_2,x,y,z)

# load rgl library

library('rgl')

# make 3D plot

plot3d(x,y,z)

它并不完美,但是用字母 a-w 来区分组怎么样?

  with(df,plot3d(x,y,z))
  with(df,text3d(x,y,z,texts=letters[titles_2]))

因为我要将 3D 图用于出版目的,所以我现在使用此解决方案。它不是假装是最好的。

# generate data

prefix=rep("ID",69)
suffix=rep(1:23,3)
suffix_2=as.character(suffix[order(suffix)])
titles_1=paste(prefix,suffix,sep="_")
titles_2=titles_1[order(titles_1)]
x=1:69
y=x+20
z=x+50
df=data.frame(titles_2,x,y,z)

# load rgl library

library('rgl')

# load randomcoloR library

library(randomcoloR)

# create a custom palette

palette <- distinctColorPalette(23)

palette(palette)

# make 3D plot

plot3d(x,y,z,size = 10,col=suffix[order(suffix)])

如果您喜欢生活在前沿,有一个新函数 rgl::pch3d() 可以使用与 points() 相同的代码绘制符号 在基础图形中。它在 rgl 0.95.1475 中,可在 R-forge 上获得(并在几个小时内在 Github 上获得;参见 )。它还没有完全与 rglwidget() 一起工作。

示例代码

open3d()
i <- 0:25; x <- i %% 5; y <- rep(0, 26); z <- i %/% 5
pch3d(x, y, z, pch = i, bg = "green")
text3d(x, y, z + 0.3, i)
pch3d(x + 5, y, z, pch = LETTERS[i+1])
text3d(x + 5, y, z + 0.3, i+65)

产生这个显示(在一些调整大小和旋转之后):