Sarebbe conveniente selezionare in modo interattivo un punto di vista decente utilizzando rgl
e quindi adottare lo stesso orientamento in una trama 3D lattice
. Ad esempio, dato il seguente grafico usando un punto di vista non informativo.replica di un punto di vista della rete in lattice
library(lattice)
wireframe(volcano, screen = list(x=0, y=0, z=0))
Lo stesso può essere aperto in rgl
da
library(rgl)
persp3d(volcano)
view3d(0, 0)
interattivo è facile ruotare la trama di una vista informativo.
La matrice dando la corrente rgl
punto di vista in può essere estratto con
p <- par3d()
p$userMatrix
Come può questa matrice essere convertiti in corrispondenti x
, y
, z
screen
parametri di replicare la vista in lattice ?
UPDATE 1
Ho provato conversione 42 di seguito. Il codice mostra la trama rgl e il grafico reticolare corrispondente per riga. Se l'ho implementato correttamente (vedi il codice sotto), sembra che ci sia ancora un problema.
# convert rgl viewpoint into lattice
# screen orientation
rgl_to_lattice_viewpoint <- function()
{
p <- par3d()
rotm <- p$userMatrix
B = 360*atan(rotm[1,2]/rotm[2,2])/(2*pi)
P = 360*asin(-rotm[3,2])/(2*pi)
H = 360*atan(rotm[3,1]/rotm[3,3])/(2*pi)
list(x=-B, y=-P, z=-H)
}
# read and plot PNG image
plot_png <- function(f)
{
img <- readPNG(f)
rimg <- as.raster(img) # raster multilayer object
plot(NULL, xlim=c(0,1), ylim=c(0,1), xlab = "", ylab = "",
asp=1, frame=F, xaxt="n", yaxt="n")
rasterImage(rimg, 0, 0, 1, 1)
}
# create rgl snapshot with random rotation and
# corresponding lattice wireframe plot
lattice_plus_rgl_plot <- function()
{
# rgl plot random rotation
persp3d(volcano, col = "green3")
theta <- sample(-180:180, 1)
phi <- sample(-90:90, 1)
view3d(theta, phi, fov=40)
v <- rgl_to_lattice_viewpoint()
f <- tempfile(fileext = ".png")
rgl.snapshot(f)
rgl.close()
# lattice plot
f2 <- tempfile(fileext = ".png")
png(f2)
print(wireframe(volcano, screen = v))
dev.off()
# plot both
plot_png(f)
plot_png(f2)
}
# CREATE SOME PLOTS
library(rgl)
library(lattice)
library(png)
par(mfrow=c(3,2), mar=c(0,0,0,0))
replicate(3, lattice_plus_rgl_plot())
Grazie! :) Ho modificato il mio post (UPDATE 1) dove ho provato la conversione suggerita. Sembra che ci sia un problema dato che non ho commesso errori. –