2012-05-30 28 views
5

Ich zeichne einige Punktdaten mit plot3d(). Ich möchte meine Y-Achse Tick-Labels ein wenig näher an meine Y-Achse Tick-Markierungen bringen.R rgl Abstand zwischen den Achsen-Ticks und Tick-Labels

Der beste Weg, die ich denken kann, dies zu tun ist zu

1) zunächst die Daten zeichnen, ohne die Achsen zu zeichnen

2) rufen axis3d(), um die y-Achse zu zeichnen und Skalenmarkierungen aber Etiketten können nicht gezeichnet werden.

3) Abfrage der aktuellen Position jedes Teilstrichs im 3D-Raum. Speichern Sie Positionen in einem Vektor.

4) verwenden mtext3d() Etiketten an Positionen auf einer Anpassung an die Vektor-basierte hinzufügen

Ich bin ein Problem zwar im Schritt 3. Ich weiß nicht, wie die Position jedes Häkchen abzufragen. par3d() ermöglicht es Ihnen, eine Reihe von grafischen Parametern abzufragen, gibt es etwas ähnliches, das ich verwenden kann, um die Position jedes y-Achsen-Ticks zu erhalten?

Bin ich damit falsch? Wahrscheinlich. Hier

ist ein Beispiel Stück Code, ohne Text für y-Achse Etiketten hinzugefügt ....

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

Antwort

2

Eine Möglichkeit, dies zu tun ist, um explizit die entsprechenden Kontrollstellen zu definieren, bevor die Achse zeichnen, statt abfragt sie nach dem Zeichnen der Achse. Dann können Sie die line= Möglichkeit mtext3d verwenden, um die Entfernung der Zecke Etiketten von der Achse so steuern:

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

Ich finde, dass der einfachste Weg, sowohl die Etikettenposition zu steuern und ticken Länge in axis3d ist neu zu schreiben die Funktion mit ein paar zusätzlichen Parametern ticksize und lab_dist hinzugefügt, die verwendet werden können, um die Standardwerte zu überschreiben, die in der Funktion eingebettet sind. Die Standardwerte von ticksize = 0.05 und lab_dist = 3 reproduzieren das Verhalten des ursprünglichen axis3d.

Um kleinere Ticks und nähere Etiketten zu erhalten, können Sie es dann mit z.

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

Die neue Funktion sieht wie folgt aus:

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) 
} 
Verwandte Themen