Поместите фиксированный заголовок в интерактивный 3D-график, используя пакет rgl, R

Я пытаюсь добавить фиксированный заголовок к интерактивному 3D-графику, используя пакет rgl из R, но пока мне это не удалось. Я также хотел бы иметь один основной заголовок и подзаголовок под основным заголовком.

Вот пример кода,

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")

Если у вас есть хороший/простой способ поместить основной заголовок в фиксированное место (и, возможно, добавить дополнительный заголовок), это будет здорово. Заранее спасибо,


person user1626688    schedule 21.07.2013    source источник
comment
Я думаю, что то, что вы хотите, невозможно с rgl. Вы можете подумать о добавлении заголовка после того, как создадите фильм с помощью другого программного обеспечения.   -  person Bryan Hanson    schedule 22.07.2013


Ответы (4)


В настоящее время это невозможно сделать в rgl.

person Spacedman    schedule 26.08.2013
comment
Есть ли способ, чтобы хотя бы основной заголовок находился в фиксированном месте на заднем плане, пока сюжет движется? - person user1626688; 27.08.2013
comment
Нет — ?rgl.texts говорит, что текст расположен в трехмерном пространстве лицом к пользователю. Графическое устройство rgl не использует стандартную систему построения графиков R, поэтому text не будет работать, title не будет работать и т. д. Я думаю, что для реализации 2D-статического текста с использованием библиотеки ftgl, которую использует rgl, просто требуется некоторая работа на уровне C++. для его текста. - person Spacedman; 27.08.2013

Теперь возможно добавление заголовка в график RGL благодаря обновлению, выпущенному в прошлом году.

Идея состоит в том, чтобы использовать новую функцию bgplot3d, которая выводит на задний план окна RGL, как если бы это был обычный график.

Например:

# 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
})

Который дает:

Заголовок RGL с plot3d  и bgplot3d

Однако есть одно довольно важное предостережение, указанное в примечании на странице справки для bgplot3d:

Поскольку фоновые графики рисуются в виде растровых изображений, их размер не очень изящно изменяется. Лучше всего сначала определить размер окна, а затем нарисовать фон в этом размере.

person Jealie    schedule 29.10.2015

Для воспроизведения вашего скрипта не хватает kde (библиотека в комплект не входит)... в любом случае Рассматривали ли вы возможность использования:добавления после ролика:

text3d(x=0.08, y=0.97, z=0.03, title.main ,col="Blue")

где: x,y,z — местоположения на вашем графике. Я использую это вместе с scatter3d (используя также rgl).

person D Lovece    schedule 07.09.2014

Как и в случае с тестом, вы можете добавить легенду, которая останется неподвижной, и использовать ее в качестве заголовка. См. пример ниже из Добавление легенды к трехмерному графику rgl

legend3d("topright", legend = paste('Type', c('A', 'B', 'C')), pch = 16, col = rainbow(3), cex=1, inset=c(0.02))
person mlanzero    schedule 10.06.2015