我正在尝试使用R中的rgl包为交互式3D绘图添加固定标题,但到目前为止我还没能做到。我还希望在主标题下有一个主标题和副标题。
以下是示例代码
library(rgl)
data<-read.table(text=" X Y Z
1 147.0883 -18.69122 -13.90000
2 147.0894 -18.69455 -10.97250
3 147.0883 -18.69122 -17.45000
4 147.0883 -18.69122 -15.44000
5 147.0883 -18.69122 -13.45000
6 147.0909 -18.69922 -12.25000
7 147.0883 -18.69122 -17.30000
8 147.0883 -18.69122 -16.40000
9 147.0883 -18.69122 -14.30000
10 147.0883 -18.69122 -18.50000
11 147.0883 -18.69122 -15.67606
12 147.0883 -18.69122 -17.25780
13 147.0883 -18.69122 -3.64000
14 147.1164 -18.68133 -22.13000
15 147.0883 -18.69122 -18.54778
16 147.0883 -18.69122 -15.50000
17 147.1185 -18.68691 -14.55500
18 147.0883 -18.69122 -18.12500
19 147.0901 -18.69670 -14.39767",header=T)
data
a<-as.matrix(data)
# call the plug-in bandwidth estimator
H.pi<-Hpi(a,binned=TRUE)*3 ## a is a matrix of x,y,z points
# calculate the kernel densities
fhat<-kde(a,H=H.pi)
# produce a 3D plot
open3d()
title<-"Individual 1 (male)" # main title
title2<-"Site A" # subtitle
plot(fhat,cont=c(50,95),colors=c("green","red"),drawpoints=TRUE,
xlab="",ylab="", zlab="",size=1.5,ptcol="black",
axes=F,box=T,aspect=c(1,1,0.5),zlim=c(-40,0))
axes3d(c("x--","y--","z-+"),cex=0.8)
mtext3d("Longitude",edge="x--",line=3,las=2,cex=1.1)
mtext3d("Latitude",edge="y--",line=3,las=2,cex=1.1)
mtext3d("Depth (m)",edge="z-+",line=3,las=2,cex=1.1)
title3d(main=title,sub=title2,line=4)
我没有找到一个固定标题(和副标题)的好方法,这样当我将我的情节导出为3D电影时,主标题不会随着情节一起旋转......
movie3d(spin3d(axis=c(0,0,1), rpm=4),dir="~/Dropbox/R/Sample plots", duration=15, fps=10, movie="Plot 1")
如果你有一个很好/简单的方法将主标题放在一个固定的位置(并可能添加一个次要标题),那将是很好的。提前谢谢,
答案 0 :(得分:13)
现在可以将标题放在RGL图中,这要归功于去年的更新。
这个想法是使用输出到RGL窗口背景的新函数bgplot3d
,就好像它是一个普通的图。
例如:
# A minimal plot3d example
library(rgl)
a = matrix(runif(3000), ncol=3)
plot3d(a, col = rainbow(100)[cut(a[,1], breaks = seq(0,1,le=101), include.lowest = T)])
bgplot3d({
plot.new()
title(main = 'This is the main title', line = 3)
mtext(side = 1, 'This is a subtitle', line = 4)
# use here any other way you fancy to write your title
})
给出了:
有一个非常重要的警告,在bgplot3d
的帮助页面中作为注释说明:
由于背景图被绘制为位图,因此它们不会调整大小 非常优雅。最好先调整窗口大小,然后画出窗口 那个大小的背景。
答案 1 :(得分:2)
目前在rgl中无法做到这一点。
答案 2 :(得分:1)
为了重现你的脚本,缺少kde(不包括库)......无论如何 您考虑过使用:在电影之后添加:
text3d(x=0.08, y=0.97, z=0.03, title.main ,col="Blue")
其中:x,y,z是图形中的位置。我和scatter3d一起使用它(也使用rgl)。
答案 3 :(得分:0)
与关于测试的建议类似,您可以添加一个保持静止的图例并将其用作标题。请参阅以下Adding a legend to an rgl 3d plot
中的示例legend3d("topright", legend = paste('Type', c('A', 'B', 'C')), pch = 16, col = rainbow(3), cex=1, inset=c(0.02))