2012-05-30 17 views
5

Estoy trazando algunos datos de punto usando plot3d(). Me gustaría llevar mis etiquetas de eje y un poco más cerca de mis marcas de eje y y.R rgl distancia entre marcas de eje y etiquetas de marca

La mejor manera que puedo pensar en hacer esto es

1) representar los datos en primer lugar, sin dibujar los ejes

2) convocar axis3d() para dibujar el eje y, y marcas de graduación, pero suprimir las etiquetas de ser dibujado.

3) consulta la posición actual de cada marca en el espacio 3D. Almacenar posiciones en un vector.

4) utilizar mtext3d() para añadir etiquetas en las posiciones en base a un ajuste en el vector

Estoy teniendo un problema en el paso 3. No sé cómo consultar la posición de cada marca de la señal. par3d() le permite consultar una serie de parámetros gráficos, ¿hay algo similar que pueda usar para obtener la posición de cada eje y tic?

¿Me estoy acercando a esto mal? Probablemente.

Aquí es una pieza ejemplo de código, sin texto añadido para las etiquetas de eje Y ....

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

Respuesta

2

Una forma de hacer esto es definir explícitamente los lugares de garrapatas antes de sacar el eje, en lugar de consultar ellos después de dibujar el eje. A continuación, puede utilizar la opción line= de mtext3d para controlar la distancia de las etiquetas señalizadoras del eje de esta manera:

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

He encontrado que la manera más fácil de controlar tanto la posición de la etiqueta y de la señal de longitud en axis3d es volver a escribir la función con un par de parámetros adicionales ticksize y lab_dist agregados que se pueden utilizar para sobrescribir los valores predeterminados incrustados en la función. Los valores predeterminados de ticksize = 0.05 y lab_dist = 3 reproducen el comportamiento del axis3d original.

Para obtener marcas más pequeñas y etiquetas más cercanas, puede llamarlo, por ejemplo.

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

La nueva función se ve así:

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) 
} 
Cuestiones relacionadas