2012-03-05 13 views
43

को योग करने के लिए माप लिया जाता है बनाएँ मैं इस तरह एक data.frame है:खड़ी barplot जहां प्रत्येक ढेर 100%

df <- read.csv(text = "ONE,TWO,THREE 
         23,234,324 
         34,534,12 
         56,324,124 
         34,234,124 
         123,534,654") 

मैं एक प्रतिशत बार साजिश जो इस तरह दिखता है निर्माण करने के लिए चाहते हैं (लिब्रे ऑफिस कैल्क में किए गए) : enter image description here

इस प्रकार, सलाखों को स्टैंडराइज्ड किया जाना चाहिए ताकि सभी ढेर में समान ऊंचाई और रकम 100% हो। अब तक मैं जो कुछ हासिल करने में सक्षम हूं, वह है:

barplot(as.matrix(df)) 

कोई मदद?

उत्तर

71

चूंकि आप टैग करते हैं ggplot2 के साथ यह गेट करें कि अब तक जो पैकेज प्राप्त हुआ है उसके अतिरिक्त उस पैकेज (संस्करण 0.9.0) का उपयोग करके एक समाधान है।

हम geom_bar के position = "fill" पर तर्क का उपयोग करते हैं। यदि आप position_fill() (vjust और reverse) के तर्कों का उपयोग करना चाहते हैं तो आप position = position_fill() का भी उपयोग कर सकते हैं।

ध्यान दें कि आपका डेटा 'चौड़े' प्रारूप में है, जबकि ggplot2 को इसे 'लंबे' प्रारूप में होना आवश्यक है। इस प्रकार, हमें पहले डेटा को melt की आवश्यकता है।

dat <- read.table(text = " ONE TWO THREE 
1 23 234 324 
2 34 534 12 
3 56 324 124 
4 34 234 124 
5 123 534 654",sep = "",header = TRUE) 

#Add an id variable for the filled regions 
library(reshape) 
datm <- melt(cbind(dat, ind = rownames(dat)), id.vars = c('ind')) 

library(scales) 
ggplot(datm,aes(x = variable, y = value,fill = ind)) + 
    geom_bar(position = "fill",stat = "identity") + 
    # or: 
    # geom_bar(position = position_fill(), stat = "identity") 
    scale_y_continuous(labels = percent_format()) 

enter image description here

+1

क्या पैकेज पिघल जाता है() का हिस्सा है? क्या यह reshape2 है? –

+3

हां; मैं क्षमाप्रार्थी हूं।इतने लंबे समय तक ggplot2 ने उन पैकेजों को अपने आप लोड किया, मैं जंगली हो गया हूं। – joran

+0

मैंने इसे रीशेप पैकेज से पिघलने का प्रयास किया और मुझे निम्न त्रुटि मिली: "स्केल $ लेबल (ब्रेक) में त्रुटि: अप्रयुक्त तर्क (ब्रेक)" मुझे आश्चर्य है कि ऐसा इसलिए है क्योंकि मैं एक सीएसवी से पढ़ रहा हूं। –

3

आपको प्रत्येक तत्व को अपने कॉलम में मानों के योग से विभाजित करने की आवश्यकता है। (आप इसे पंक्तियों पर लागू होता है 1 का उपयोग कर)

data.perc <- apply(data, 2, function(x){x/sum(x)}) 

ध्यान दें कि दूसरा पैरामीटर apply बताता कॉलम के लिए प्रदान समारोह लागू करने के लिए:

ऐसा पर्याप्त होना चाहिए। अज्ञात फ़ंक्शन, फिर, प्रत्येक डेटा कॉलम को एक बार में पारित कर देता है।

12

prop.table टेबल के अनुपात प्राप्त करने का एक अच्छा दोस्ताना तरीका है।

m <- matrix(1:4,2) 

m 
    [,1] [,2] 
[1,] 1 3 
[2,] 2 4 

छोड़कर मार्जिन खाली आप पूरी तालिका

prop.table(m, margin=NULL) 
    [,1] [,2] 
[1,] 0.1 0.3 
[2,] 0.2 0.4 

देते यह 1 आप अनुपात पंक्ति

prop.table(m, 1) 
     [,1]  [,2] 
[1,] 0.2500000 0.7500000 
[2,] 0.3333333 0.6666667 

और 2 देता है के अनुपात को देता है स्तंभ अनुपात

prop.table(m, 2) 
      [,1]  [,2] 
[1,] 0.3333333 0.4285714 
[2,] 0.6666667 0.5714286 
10

क्रिस Beeley rigth है, आप केवल अनुपात कॉलम के आधार पर की जरूरत है। अपने डेटा का उपयोग करना है:

your_matrix<-( 
       rbind(
         c(23,234,324), 
         c(34,534,12), 
         c(56,324,124), 
         c(34,234,124), 
         c(123,534,654) 
        ) 
       ) 

barplot(prop.table(your_matrix, 2)) 

देता है:

enter image description here

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