2013-07-21 12 views
7

Sto cercando di aggiungere un titolo fisso a un grafico 3D interattivo usando il pacchetto rgl di R, ma finora non sono stato in grado di farlo. Mi piacerebbe anche avere un titolo principale e un sottotitolo sotto il titolo principale.Inserire un titolo fisso in un grafico 3D interattivo usando il pacchetto rgl, R

Ecco un esempio di codice,

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) 

non ho trovato un buon modo di avere un titolo fisso (e sottotitolo) in modo che, quando posso esportare il mio trama come un film in 3D, il titolo principale è non gira con la trama ...

movie3d(spin3d(axis=c(0,0,1), rpm=4),dir="~/Dropbox/R/Sample plots", duration=15, fps=10, movie="Plot 1") 

Se si dispone di un buon modo/semplice di mettere il titolo principale in una posizione fissa (ed eventualmente l'aggiunta di un titolo secondario sotto) che sarà grande. Grazie in anticipo,

+0

Penso che quello che vuoi non sia possibile con 'rgl'. Potresti considerare di aggiungere il titolo dopo aver creato il film utilizzando un altro software. –

risposta

2

Al momento non è possibile effettuare questa operazione.

+0

C'è un modo per avere almeno il titolo principale in una posizione fissa in background mentre la trama è in movimento? – user1626688

+2

No -? Rgl.texts dice che il testo è posizionato nello spazio 3d, di fronte all'utente. Il dispositivo di grafica rgl non usa il sistema di tracciamento standard in modo che 'text' non funzioni,' title' non funzioni ecc. Penso che abbia bisogno di un po 'di lavoro a livello di C++ per implementare il testo statico 2d usando il ftgl libreria che rgl usa per il suo testo. – Spacedman

+5

Vedere [qui] (http://stackoverflow.com/a/33425187/3001626) –

1

a riprodurre il tuo kde script è mancante (una libreria non incluso) ... in ogni caso Forse si considera utilizzando: l'aggiunta dopo il film:

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

dove: x, y, z sono luoghi nella tua grafica. Ho usato questo insieme a scatter3d (usando anche l'uso di RGL).

0

Analogamente al suggerimento sul test, è possibile aggiungere una legenda che rimane ferma e usarla come titolo. Vedere l'esempio di seguito da 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)) 
12

Mettere un titolo in una trama RGL è ora possibile, grazie ad un aggiornamento risale allo scorso anno.

L'idea è di utilizzare la nuova funzione bgplot3d che restituisce lo sfondo della finestra RGL, come se fosse una trama normale.

Ad esempio:

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

che dà:

                                                                                                RGL title with plot3d and bgplot3d

C'è un avvertimento piuttosto importante, però, ha dichiarato come nota nella guida Pagina per bgplot3d:

Perché le trame di sfondo sono disegnati come bitmap, essi non vengono ridimensionate molto garbo. È preferibile ridimensionare prima la finestra, quindi disegnare lo sfondo con queste dimensioni.

Problemi correlati