2012-05-30 7 views
5

plot3d()를 사용하여 일부 점 데이터를 플로팅합니다. y 축 눈금 레이블을 y 축 눈금에 조금 더 가깝게 가져오고 싶습니다. I는 이렇게 생각할 수Rigg 축 틱과 눈금 레이블 간의 거리

가장 좋은 방법은 y 축선을 그리고 눈금하는 축

2) axis3d에() 호출을 그리지 않고,

1) 첫 번째 데이터를 플롯이지만 레이블이 표시되지 않도록합니다.

3) 3D 공간에서 각 눈금의 현재 위치를 쿼리합니다. 위치를 벡터에 저장합니다.

4) 벡터

나는 각 눈금의 위치를 ​​조회하는 방법을 모른다 3 단계에서 문제가 있습니다에 조정에 따라 위치에 레이블을 추가 할 수 mtext3d()를 사용합니다. par3d()를 사용하면 여러 그래픽 매개 변수를 쿼리 할 수 ​​있습니다. 각 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

한가지 방법은 명시 적으로 축 드로잉 대신 질의 전에 눈금 위치를 정의하는 것이다 .... Y 축 레이블 추가 텍스트없이, 코드의 예시적인 조각 축을 그린 후에 그것들.

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의 길이를 체크하는 가장 쉬운 방법은 다시 작성하는 것으로 나타났습니다 : 그럼 당신은 같은 축에서 눈금 레이블의 거리를 제어하는 ​​mtext3dline= 옵션을 사용할 수 있습니다 함수에 포함 된 기본값을 덮어 쓸 때 사용할 수있는 두 가지 추가 매개 변수 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) 
}