[英]R rgl distance between axis ticks and tick labels
我正在使用plot3d()繪制一些點數據。 我想讓我的y軸刻度標簽更接近我的y軸刻度標記。
我能想到這樣做的最好方法是
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))
一種方法是在繪制軸之前明確定義刻度線位置,而不是在繪制軸之后查詢它們。 然后你可以使用mtext3d
的line=
選項來控制刻度標簽與軸的距離,如下所示:
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)
我發現在axis3d中控制標簽位置和刻度長度的最簡單方法是用一些額外的參數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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.