2012-05-30 21 views
5

Plamię dane punktów za pomocą plot3d(). Chciałbym, aby moje znaczniki osi y były trochę bliżej znaczników my Y osi.R rgl odległość między tykami osi i etykietami zaznaczenia

Najlepszym sposobem mogę myśleć robi to do

1) wykreślić dane po pierwsze, bez rysowania osi

2) Zaproszenie na axis3d(), aby narysować oś y i znaczniki ale pomijanie rysowania etykiet.

3) zapytaj aktualną pozycję każdego znaku podziałki w przestrzeni 3D. Przechowuj pozycje w wektorze.

4) korzystać mtext3d(), aby dodać etykiety w pozycjach opartych na dostosowanie do wektora

Mam problem w punkcie 3. nie wiem jak zapytać położenie każdego znaku kleszcza. par3d() pozwala na zapytanie o kilka parametrów graficznych, czy jest coś podobnego, czego mogę użyć, aby uzyskać pozycję dla każdej osi y?

Czy zbliżam się do tego źle? Prawdopodobnie.

Oto przykładowy fragment kodu, bez tekstu dodanego do osi y etykiet ....

require(rgl) 
x <- rnorm(5) 
y <- rnorm(5) 
z <- rnorm(5) 
open3d() 
plot3d(x,y,z,axes=F,xlab="",ylab="",zlab="") 
par3d(ignoreExtent=TRUE) 
par3d(FOV=0) 
par3d(userMatrix=rotationMatrix(0,1,0,0)) 
axis3d('y',nticks=5,labels = FALSE) 
par3d(zoom=1) 
par3d(windowRect=c(580,60,1380,900)) 

Odpowiedz

2

Jednym ze sposobów, aby to zrobić jest jawnie określić lokalizacje kleszcza przed wyciągnięciem oś, zamiast odpytywania je po narysowaniu osi. Następnie można korzystać z opcji mtext3dline= kontrolować dystans etykietach kleszczy od osi jak ten:

require(rgl) 
rgl.close() 
x <- rnorm(5) 
y <- rnorm(5) 
z <- rnorm(5) 
open3d() 
plot3d(x,y,z,axes=F,xlab="",ylab="",zlab="") 
par3d(ignoreExtent=TRUE) 
par3d(FOV=0) 
par3d(userMatrix=rotationMatrix(0,1,0,0)) 
par3d(zoom=1) 
par3d(windowRect=c(580,60,1380,900)) 

# and here is the trick: 
my.ticks <- pretty(y, n=5) 
axis3d('y', at=my.ticks, labels=rep("", 5)) 
mtext3d(paste(my.ticks), at=my.ticks, edge='y', line=.6) 
1

uważam, że najprostszym sposobem na kontrolowanie zarówno położenie etykiety i zaznaczyć długość w axis3d jest do przerobienia funkcja z kilkoma dodatkowymi parametrami ticksize i lab_dist dodanymi, które mogą być użyte do nadpisania wartości domyślnych osadzonych w funkcji. Domyślne wartości ticksize = 0.05 i lab_dist = 3 odtwarzają zachowanie oryginalnego axis3d.

Aby uzyskać mniejsze znaczniki i bliższe etykiety, można wywołać je za pomocą np.

axis3('y', nticks=5, labels = FALSE, ticksize = 0.03, lab_dist = 2) 

Nowa funkcja wygląda tak:

axis3 <- function (edge, at = NULL, labels = TRUE, tick = TRUE, line = 0, 
      pos = NULL, nticks = 5, ticksize = 0.05, lab_dist = 3, ...) 
{ 
    save <- par3d(skipRedraw = TRUE, ignoreExtent = TRUE) 
    on.exit(par3d(save)) 
    ranges <- rgl:::.getRanges() 
    edge <- c(strsplit(edge, "")[[1]], "-", "-")[1:3] 
    coord <- match(toupper(edge[1]), c("X", "Y", "Z")) 
    if (coord == 2) 
    edge[1] <- edge[2] 
    else if (coord == 3) 
    edge[1:2] <- edge[2:3] 
    range <- ranges[[coord]] 
    if (is.null(at)) { 
    at <- pretty(range, nticks) 
    at <- at[at >= range[1] & at <= range[2]] 
    } 
    if (is.logical(labels)) { 
    if (labels) 
     labels <- format(at) 
    else labels <- NA 
    } 
    mpos <- matrix(NA, 3, length(at)) 
    if (edge[1] == "+") 
    mpos[1, ] <- ranges$x[2] 
    else mpos[1, ] <- ranges$x[1] 
    if (edge[2] == "+") 
    mpos[2, ] <- ranges$y[2] 
    else mpos[2, ] <- ranges$y[1] 
    if (edge[3] == "+") 
    mpos[3, ] <- ranges$z[2] 
    else mpos[3, ] <- ranges$z[1] 
    ticksize <- ticksize * (mpos[, 1] - c(mean(ranges$x), mean(ranges$y), 
            mean(ranges$z))) 
    ticksize[coord] <- 0 
    if (!is.null(pos)) 
    mpos <- matrix(pos, 3, length(at)) 
    mpos[coord, ] <- at 
    x <- c(mpos[1, 1], mpos[1, length(at)]) 
    y <- c(mpos[2, 1], mpos[2, length(at)]) 
    z <- c(mpos[3, 1], mpos[3, length(at)]) 
    if (tick) { 
    x <- c(x, as.double(rbind(mpos[1, ], mpos[1, ] + ticksize[1]))) 
    y <- c(y, as.double(rbind(mpos[2, ], mpos[2, ] + ticksize[2]))) 
    z <- c(z, as.double(rbind(mpos[3, ], mpos[3, ] + ticksize[3]))) 
    } 
    result <- c(ticks = segments3d(x, y, z, ...)) 
    if (!all(is.na(labels))) 
    result <- c(result, labels = text3d(mpos[1, ] + lab_dist * ticksize[1], 
             mpos[2, ] + lab_dist * ticksize[2], 
             mpos[3, ] + lab_dist * ticksize[3], 
             labels, ...)) 
    lowlevel(result) 
} 
Powiązane problemy