2015-03-18 5 views
9

मैं कुछ गैर परंपरागत साजिश लेबलिंग करने की कोशिश कर रहा हूं और mtext और axis में उपयोगकर्ता निर्देशांक में line पैरामीटर को परिवर्तित करने का एक तरीका चाहूंगा।उपयोगकर्ता निर्देशांक में मार्जिन लाइन स्थान (mgp) प्राप्त करें

दूसरे शब्दों में मैं मानकों को par()$mgp में मानों को परिवर्तित करना चाहता हूं।

setup_plot <- function() { 
    par(mar = c(2, 10, 2, 2), oma = rep(2, 4)) 
    plot.new() 
    plot.window(xlim = c(0, 1), ylim = c(0, 1)) 
    box(which = "plot", lwd = 2, col = "gray40") 
    box(which = "figure", lwd = 2, col = "darkred") 
    box(which = "outer", lwd = 2, col = "darkgreen") 
    text(x = 0.5, y = 0.5, 
     labels = "Plot Region", 
     col = "gray40", font = 2) 
    mtext(side = 3, text = "Figure region", line = 0.5, col = "darkred", font = 2) 
    mtext(side = 3, text = "Device region", line = 2.5, col = "darkgreen", font = 2) 
    for (i in 0:9) { 
    mtext(side = 2, col = "darkred", text = paste0("Line", i), line = i) 
    } 
} 

मैं दो अलग-अलग दृष्टिकोण की कोशिश की है:

यह समस्या को दिखाता है।

## Try one approach where a line is the string height of "M" 
setup_plot() 
xline = strheight("M", units = "user") 
abline(v = par()$usr[1] - 0:9*xline, 
     xpd = TRUE, lty = "dashed", col = "gray40") 

Lines do not line up with the text

## Try a second approach defining a line using par()$mai & par()$mar 
setup_plot() 
xline = abs(grconvertX(unique(par()$mai/par()$mar), "inches", "user")) 
abline(v = par()$usr[1] - 0:9*xline, 
     xpd = TRUE, lty = "dashed", col = "gray40") 

Only one line is drawn

आप लाइन पदों कैसे मिलता है उपयोगकर्ता निर्देशांक में?

नोट: यहां के आंकड़े 6 इंच से 4 इंच हैं। आउटपुट आकार बदलने से लाइनों को कैसे खींचा जाता है - जो मुझे समझ में नहीं आता है।

+0

यह वह उत्तर नहीं है जिसे आप ढूंढ रहे हैं, लेकिन यह कुछ ऐसा है जो आप अन्य सभी विफल होने पर उपयोग कर सकते हैं: 'mtext (side = 2, col = "gray40", text = paste (rep ("_", 45), पतन = ""), लाइन = सी (0: 9)) ' – Jota

+0

यह एक चालाक हैक है, लेकिन मैं वास्तव में रेखाओं को चित्रित करने में रूचि नहीं रखता हूं। मैं सिर्फ यह दिखाने के लिए लाइनों का उपयोग कर रहा था कि मुझे नहीं पता कि सही स्थान कैसे प्राप्त करें। – dayne

उत्तर

9

निम्नलिखित चाल करना चाहिए:

setup_plot() 
abline(v=par('usr')[1] - (0:9) * 
     diff(grconvertX(0:1, 'inches', 'user')) * 
     par('cin')[2] * par('cex') * par('lheight'), 
     xpd=TRUE, lty=2) 

margin_lines

par('cin')[2] * par('cex') * par('lheight') रिटर्न इंच में वर्तमान पंक्ति की ऊंचाई है, जो हम उपयोगकर्ता के लिए परिवर्तित diff(grconvertX(0:1, 'inches', 'user')), उपयोगकर्ता में एक इंच की लंबाई से गुणा करके निर्देशांक समन्वय (क्षैतिज रूप से, इस मामले में - यदि उपयोगकर्ता कॉर्ड में एक रेखा की लंबवत ऊंचाई में रुचि रखते हैं तो हम diff(grconvertY(0:1, 'inches', 'user')) का उपयोग करेंगे)। इस प्रकार

इस सुविधा के लिए एक समारोह में लपेटा जा सकता है:

line2user <- function(line, side) { 
    lh <- par('cin')[2] * par('cex') * par('lheight') 
    x_off <- diff(grconvertX(0:1, 'inches', 'user')) 
    y_off <- diff(grconvertY(0:1, 'inches', 'user')) 
    switch(side, 
     `1` = par('usr')[3] - line * y_off * lh, 
     `2` = par('usr')[1] - line * x_off * lh, 
     `3` = par('usr')[4] + line * y_off * lh, 
     `4` = par('usr')[2] + line * x_off * lh, 
     stop("side must be 1, 2, 3, or 4", call.=FALSE)) 
} 

setup_plot() 
abline(v=line2user(line=0:9, side=2), xpd=TRUE, lty=2) 

संपादित करें: समारोह है, जो लॉग इन कुल्हाड़ियों के साथ काम करता का एक अद्यतन संस्करण, उपलब्ध here है।

+0

यदि आप रुचि रखते हैं तो मैंने एक फॉलो-अप प्रश्न पूछा: http://stackoverflow.com/questions/30765866/get-margin-line-locations-in-log-space – dayne

संबंधित मुद्दे