2012-05-30 24 views
5

मैं plot3d() का उपयोग करके कुछ बिंदु डेटा प्लॉट कर रहा हूं। मैं अपने वाई धुरी टिक लेबल को अपने वाई अक्ष टिक टिक के करीब थोड़ा लाना चाहता हूं।अक्ष टिक्स और टिक लेबल के बीच आर आरजीएल दूरी

सबसे अच्छा तरीका है मैं यह कर के बारे में सोच सकते हैं,

1) पहली डेटा प्लॉट करने के लिए है कुल्हाड़ियों

2) axis3d पर कॉल() ड्राइंग y अक्ष आकर्षित और निशान टिक बिना लेकिन खींचे जाने से लेबल दबाएं।

3) 3 डी स्पेस में प्रत्येक टिक मार्क की वर्तमान स्थिति से पूछताछ करें। एक वेक्टर में स्टोर की स्थिति।

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

एक तरह से यह करने के लिए स्पष्ट रूप अक्ष ड्राइंग, बजाय क्वेरी करने से पहले टिक स्थानों परिभाषित करने के लिए है धुरी ड्राइंग के बाद उन्हें।

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 में लंबाई टिकटिक लिए सबसे आसान तरीका के पुनर्लेखन के लिए है: तो फिर तुम इस तरह अक्ष से टिक लेबल की दूरी को नियंत्रित करने के 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) 
} 
संबंधित मुद्दे