2012-05-30 177 views
5

我正在绘制一些使用plot3d()的点数据。 我想让我的y轴刻度标签更接近我的y轴刻度标记。R rgl轴刻度和刻度标记之间的距离

我能想到这样做的最好的方法是

1)第一绘制数据,无图纸的轴

2)调用上axis3d()来绘制y轴和刻度线,但抑制标签被绘制。 3)查询3D空间中每个刻度标记的当前位置。将位置存储在矢量中。

4)使用mtext3d()以基于调整到矢量

我有在步骤3中的问题,我不知道如何查询每个刻度的位置位置添加标签。 par3d()允许你查询一些图形参数,有没有类似的东西可以用来获得每个y轴的坐标?

我接近这个错误吗?大概。

下面是一个例子一段代码,不添加用于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)) 

回答

2

一种方式做,这是绘制轴线,而不是查询之前明确地定义蜱位置他们绘制轴后。然后你可以使用的mtext3dline=选项从轴这样的控制刻度标记的距离:

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

我发现,同时控制标签位置和axis3d蜱长度的最简单的方法是重写该函数添加了一些额外的参数ticksizelab_dist,它们可以用来覆盖函数中嵌入的默认值。默认值ticksize = 0.05lab_dist = 3重现原始axis3d的行为。

要获得更小的刻度和更接近的标签,可以使用例如

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

新功能看起来是这样的:

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