Es wäre bequem, interaktiv einen anständigen Blickpunkt mit rgl
auszuwählen und dann die gleiche Ausrichtung in einem lattice
3D-Plot anzunehmen. Zum Beispiel, wenn das folgende Diagramm einen nicht informativen Blickwinkel verwendet.Replikation eines RGL-Ansichtspunkts im Gitter
library(lattice)
wireframe(volcano, screen = list(x=0, y=0, z=0))
Das gleiche in rgl
von
library(rgl)
persp3d(volcano)
view3d(0, 0)
interaktiv geöffnet werden kann, ist es einfach, das Grundstück zu einer informativen Ansicht zu drehen.
Die Matrix kann die aktuelle rgl
Sicht zu geben durch
p <- par3d()
p$userMatrix
Wie kann diese Matrix in entsprechende x
, y
umgewandelt werden, z
screen
Parameter die Ansicht im Gitter zu replizieren ?
UPDATE 1
versuchte ich unter 42 Bekehrung aus. Der Code zeigt das rgl-Plot und das entsprechende Gitterplot pro Zeile. Wenn ich es richtig implementiert habe (siehe Code unten), scheint immer noch ein Problem zu bestehen.
# 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())
Danke! :) Ich habe meinen Beitrag bearbeitet (UPDATE 1), wo ich die von dir vorgeschlagene Konvertierung ausprobiert habe. Es scheint ein Problem zu bestehen, da ich keinen Fehler gemacht habe. –