在 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)
产生这个显示(在一些调整大小和旋转之后):
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)
产生这个显示(在一些调整大小和旋转之后):