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