2012-05-08 27 views
11

में मार्जिन का स्वचालित समायोजन मुझे क्षैतिज समूहबद्ध बार चार्ट की एक श्रृंखला का उत्पादन करने की आवश्यकता है। बारप्लॉट फ़ंक्शन स्वचालित रूप से साजिश के मार्जिन को समायोजित नहीं करता है, इसलिए टेक्स्ट काट दिया जाता है।क्षैतिज बार चार्ट

graphics.off()  # close graphics windows 
    test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20), 
        nrow =3 , 
       ncol=4, 
       byrow=TRUE, 
       dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"), 
           c(
           "Category 1 Long text", 
           "Category 2 very Long text", 
           "Category 3 short text", 
           "Category 4 very short text" 
           ))) 
    barplot(test, 
     las=2, 
     beside = TRUE, 
     legend=T, 
     horiz=T) 

enter image description here

मैं स्वचालित रूप से सही करने के लिए आगे साजिश चले जाने का विकल्प नहीं मिल रहा है, जिस तरह से आर dotchart समारोह यह करता है ((एसएएस में barchart प्रक्रिया मार्जिन समायोजित कर देता है स्वतः ही)। जाहिर है, मैं हमेशा हाशिए मैन्युअल बराबर समारोह का उपयोग कर समायोजित कर सकते हैं।

par(mar=c(5.1, 13 ,4.1 ,2.1)) 

सही

करने के लिए साजिश चले जाएँगे

क्या साजिश को दाईं ओर ले जाने का कोई विकल्प है (यानी। मार्जिन समायोजित करें) पाठ की लंबाई के आधार पर स्वचालित रूप से?

2 संबंधित appproaches के बारे में सोच सकते हैं कि यह प्रोग्राम के रूप में करने के लिए: 1) सबसे लंबे समय तक पाठ स्ट्रिंग की लंबाई की गणना करें और उसके अनुसार बाईं मार्जिन समायोजित 2) डेटा के लिए एक dotchart साजिश बनाएँ, किसी भी तरह मार्जिन और उपयोग पर कब्जा बार चार्ट में एक ही मार्जिन।

क्या ऐसा करने का कोई आसान तरीका है? धन्यवाद!

उत्तर

11

मुझे लगता है कि आपका पहला विचार शायद सबसे उपयुक्त है। ऐसा कुछ ठीक काम करता प्रतीत होता है और इसके बारे में ज्यादा सामान की आवश्यकता नहीं होती है।

ylabels <- c( "1oooooooooooo", 
      "2", 
      "3", 
      "4" 
) 

test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20), 
        nrow =3 , 
       ncol=4, 
       byrow=TRUE, 
       dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"), 
           ylabels)) 

# adjust to the maximum of either the default 
# or a figure based on the maximum length 
par(mar=c(5.1, max(4.1,max(nchar(ylabels))/1.8) ,4.1 ,2.1)) 

barplot(test, 
     las=2, 
     beside = TRUE, 
     legend=T, 
     horiz=T) 

dotchart निरीक्षण के बाद, एक और अधिक generalisable समाधान भी उपयोग करने के लिए हो सकता है:

linch <- max(strwidth(ylabels, "inch")+0.4, na.rm = TRUE) 
par(mai=c(1.02,linch,0.82,0.42)) 
+0

धन्यवाद! मैंने आपके कोड को विभिन्न टेक्स्ट स्ट्रिंग के साथ करने की कोशिश की, मार्जिन ठीक काम करते हैं। आप 1.8 के साथ कैसे आए? –

+0

@ मैक्स चेर्नी - नचर पर कुछ बुनियादी अंकगणित: मार्जिन अनुपात और कुछ परीक्षण और त्रुटि। मैं वादा नहीं कर सकता कि यह विभिन्न फ़ॉन्ट आकार/शैलियों के अनुकूल हो जाएगा लेकिन गणनाओं को आप आसानी से समायोजित कर सकते हैं जैसा कि आप देख सकते हैं। – thelatemail

+0

@thelatemail - मुझे आश्चर्य है कि ऊपर दिया गया समाधान खाता विस्तार कारकों में आता है, कहें कि क्या मैं डिफ़ॉल्ट के बजाय cex.lab = 2 सेट करता हूं। धन्यवाद! – Alex