श्रेणीबद्ध चर के चार्ट में गिनती के बजाय% दिखाएं


170

मैं एक श्रेणीगत चर की साजिश रच रहा हूं और इसके बजाय प्रत्येक श्रेणी के मूल्य के लिए मायने रखता हूं।

मैं ggplotउस श्रेणी में मूल्यों के प्रतिशत को प्रदर्शित करने के लिए एक रास्ता ढूंढ रहा हूं । बेशक, गणना किए गए प्रतिशत के साथ एक और चर बनाना संभव है और उस एक को प्लॉट करना है, लेकिन मुझे इसे कई दर्जनों बार करना होगा और मैं इसे एक कमांड में प्राप्त करने की उम्मीद करता हूं।

मैं जैसे कुछ प्रयोग कर रहा था

qplot(mydataf) +
  stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
  scale_y_continuous(formatter = "percent")

लेकिन मुझे गलत तरीके से इसका उपयोग करना चाहिए, क्योंकि मुझे त्रुटियां मिलीं।

सेटअप को आसानी से पुन: पेश करने के लिए, यहां एक सरल उदाहरण दिया गया है:

mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc");
mydataf <- factor(mydata);
qplot (mydataf); #this shows the count, I'm looking to see % displayed.

असली मामले में, मैं शायद के ggplotबजाय का उपयोग करेंगे qplot, लेकिन सही तरीके से स्टेटीन का उपयोग करने के लिए मुझे अभी भी हटा देता है।

मैंने भी इन चार तरीकों की कोशिश की है:

ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + 
  scale_y_continuous(formatter = 'percent');

ggplot(mydataf, aes(y = (..count..)/sum(..count..))) + 
  scale_y_continuous(formatter = 'percent') + geom_bar();

ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + 
  scale_y_continuous(formatter = 'percent');

ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) + 
  scale_y_continuous(formatter = 'percent') + geom_bar();

लेकिन सभी 4 देते हैं:

Error: ggplot2 doesn't know how to deal with data of class factor

के साधारण मामले के लिए वही त्रुटि दिखाई देती है

ggplot (data=mydataf, aes(levels(mydataf))) +
  geom_bar()

तो यह स्पष्ट रूप से कुछ के बारे में कैसे ggplotएक वेक्टर के साथ बातचीत करता है। मैं अपना सिर खुजला रहा हूँ, उस त्रुटि के लिए गुगली करना एक ही परिणाम देता है ।


2
डेटा एक डेटा फ्रेम होना चाहिए, नंगे कारक नहीं।
हैडली

1
हैडले की टिप्पणी में जोड़ने के लिए, mydataf = data.frame (mydataf) का उपयोग करके अपने डेटा को डेटा फ़्रेम में परिवर्तित करना, और इसे नाम (mydataf) के रूप में नाम देना = फू ट करना होगा
रामनाथ

जवाबों:


221

चूंकि यह उत्तर दिया गया था कि ggplotवाक्य रचना में कुछ सार्थक बदलाव हुए हैं। उपरोक्त टिप्पणियों में चर्चा का सारांश:

 require(ggplot2)
 require(scales)

 p <- ggplot(mydataf, aes(x = foo)) +  
        geom_bar(aes(y = (..count..)/sum(..count..))) + 
        ## version 3.0.0
        scale_y_continuous(labels=percent)

यहाँ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण का उपयोग किया गया है mtcars:

 ggplot(mtcars, aes(x = factor(hp))) +  
        geom_bar(aes(y = (..count..)/sum(..count..))) + 
        scale_y_continuous(labels = percent) ## version 3.0.0

यहां छवि विवरण दर्ज करें

यह प्रश्न वर्तमान में 'ggplot count बनाम प्रतिशत हिस्टोग्राम' के लिए Google पर # 1 हिट है, इसलिए उम्मीद है कि यह स्वीकृत उत्तर पर टिप्पणियों में वर्तमान में दर्ज की गई सभी जानकारी को दूर करने में मदद करता है।

टिप्पणी: यदि hpकारक के रूप में सेट नहीं किया गया है, तो ggplot रिटर्न:

यहां छवि विवरण दर्ज करें


12
इस उत्तर के लिए धन्यवाद। इसे कक्षा-वार कैसे किया जाए इस पर कोई विचार?
WAF

3
जैसा कि @ WAF सुझाव देता है, यह उत्तर मुखरित डेटा के साथ काम नहीं करता है। @ @ Erwan की टिप्पणी stackoverflow.com/questions/22181132/… ​​पर देखें
लीज़ैम्पारो

1
आपको percentउस पैकेज के साथ उपसर्ग करने की आवश्यकता हो सकती है जो ऊपर काम करने के लिए है (मैंने किया था)। ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(labels = scales::percent)
मामिकिन्स

इसके geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..]))बजाय चारों ओर पहलुओं का उपयोग करने के लिए। प्रत्येक पहलू 100% तक होना चाहिए।
1

क्या उनके साथ ".." वैरिएबल नहीं था जो उनके साथ स्टेट () - कमांड के साथ बदला गया था? ggplot2.tidyverse.org/reference/stat.html
मैग्नस

58

यह संशोधित कोड काम करना चाहिए

p = ggplot(mydataf, aes(x = foo)) + 
    geom_bar(aes(y = (..count..)/sum(..count..))) + 
    scale_y_continuous(formatter = 'percent')

यदि आपके डेटा में NA हैं और आप उन्हें प्लॉट में शामिल नहीं करना चाहते हैं, तो ggplot के तर्क के रूप में na.omit (mydataf) पास करें।

उम्मीद है की यह मदद करेगा।


37
ध्यान दें कि ggplot2 संस्करण 0.9.0 में formatterतर्क अब काम नहीं करेगा। इसके बजाय, आप कुछ ऐसा चाहते हैं labels = percent_format())
जोरान

25
और 0.9.0 के साथ आपको scalesउपयोग करने से पहले पुस्तकालय को लोड percent_format()करना होगा, अन्यथा यह काम नहीं करेगा। 0.9.0 स्वचालित रूप से अब सपोर्टिंग पैकेज लोड नहीं करता है।
एंड्रयू

1
देख लो ? stat_bin। यह दिखाता है कि डेटा फ्रेम में कौन से अतिरिक्त कॉलम जोड़े गए हैं ggplot2। सभी अतिरिक्त कॉलम फॉर्म के हैं ..variable..
रामनाथ

1
यह aes(y = (..count..)/sum(..count..))बस के साथ बदलने के लिए समझ में आता है aes(y = ..density..)? नेत्रहीन यह बहुत समान (लेकिन अभी भी अलग) तस्वीर देते हैं
अलेक्जेंडर कोसेनकोव

6
Ggplot में 0.9.3.1.0, आप पहले scalesपुस्तकालय को लोड करना चाहेंगे , फिर डॉक्स मेंscale_y_continuous(labels=percent) बताए अनुसार उपयोग करें
adilapapaya


37

मार्च 2017 तक, ggplot22.2.1 के साथ मुझे लगता है कि डेटा विज्ञान पुस्तक के लिए हैडली विकम के आर में सबसे अच्छा समाधान बताया गया है:

ggplot(mydataf) + stat_count(mapping = aes(x=foo, y=..prop.., group=1))

stat_countदो चर की गणना करता है: countडिफ़ॉल्ट रूप से उपयोग किया जाता है, लेकिन आप उपयोग करना चुन सकते हैं propजो अनुपात दिखाता है।


3
यह जून 2017 तक सबसे अच्छा उत्तर है, समूह द्वारा भरने और चेहरे के साथ काम करता है।
स्कुमिन

1
किसी कारण से यह मुझे fillमैपिंग का उपयोग करने की अनुमति नहीं देता है (कोई त्रुटि नहीं डाली गई है, लेकिन कोई रंग नहीं जोड़ा गया है)।
मैक्स कैंडोसिया

@ MaxCandocia मुझे group = 1भरने की मैपिंग प्राप्त करने के लिए निकालना पड़ा । शायद यह मदद करता है
TJbo

1
यदि मैं groupपैरामीटर को हटाता हूं , हालांकि, यह उचित प्रतिशत नहीं दिखाता है, क्योंकि प्रत्येक अद्वितीय एक्स मूल्य के लिए सब कुछ अपने स्वयं के समूह से संबंधित है।
मैक्स कैंडोसिया

20

यदि आप y- अक्ष पर प्रतिशत चाहते हैं और सलाखों पर लेबल किए गए हैं:

library(ggplot2)
library(scales)
ggplot(mtcars, aes(x = as.factor(am))) +
  geom_bar(aes(y = (..count..)/sum(..count..))) +
  geom_text(aes(y = ((..count..)/sum(..count..)), label = scales::percent((..count..)/sum(..count..))), stat = "count", vjust = -0.25) +
  scale_y_continuous(labels = percent) +
  labs(title = "Manual vs. Automatic Frequency", y = "Percent", x = "Automatic Transmission")

यहां छवि विवरण दर्ज करें

बार लेबल जोड़ते समय, आप अंत तक जोड़कर, एक क्लीनर चार्ट के लिए y- अक्ष को छोड़ना चाहते हैं:

  theme(
        axis.text.y=element_blank(), axis.ticks=element_blank(),
        axis.title.y=element_blank()
  )

यहां छवि विवरण दर्ज करें


6

यदि आप प्रतिशत लेबल चाहते हैं, लेकिन y अक्ष पर वास्तविक एनएस, तो यह कोशिश करें:

    library(scales)
perbar=function(xx){
      q=ggplot(data=data.frame(xx),aes(x=xx))+
      geom_bar(aes(y = (..count..)),fill="orange")
       q=q+    geom_text(aes(y = (..count..),label = scales::percent((..count..)/sum(..count..))), stat="bin",colour="darkgreen") 
      q
    }
    perbar(mtcars$disp)

6

यहाँ मुखर डेटा के लिए एक समाधान है। (@Andrew द्वारा स्वीकार किए गए उत्तर इस मामले में काम नहीं करते हैं।) विचार यह है कि dplyr का उपयोग करके प्रतिशत मूल्य की गणना करें और फिर भूखंड बनाने के लिए geom_col का उपयोग करें।

library(ggplot2)
library(scales)
library(magrittr)
library(dplyr)

binwidth <- 30

mtcars.stats <- mtcars %>%
  group_by(cyl) %>%
  mutate(bin = cut(hp, breaks=seq(0,400, binwidth), 
               labels= seq(0+binwidth,400, binwidth)-(binwidth/2)),
         n = n()) %>%
  group_by(cyl, bin) %>%
  summarise(p = n()/n[1]) %>%
  ungroup() %>%
  mutate(bin = as.numeric(as.character(bin)))

ggplot(mtcars.stats, aes(x = bin, y= p)) +  
  geom_col() + 
  scale_y_continuous(labels = percent) +
  facet_grid(cyl~.)

यह साजिश है:

यहां छवि विवरण दर्ज करें


3

ध्यान दें कि यदि आपका चर निरंतर है, तो आपको geom_histogram () का उपयोग करना होगा, क्योंकि फ़ंक्शन चर को "बिन" द्वारा समूह देगा।

df <- data.frame(V1 = rnorm(100))

ggplot(df, aes(x = V1)) +  
  geom_histogram(aes(y = (..count..)/sum(..count..))) 

# if you use geom_bar(), with factor(V1), each value of V1 will be treated as a
# different category. In this case this does not make sense, as the variable is 
# really continuous. With the hp variable of the mtcars (see previous answer), it 
# worked well since hp was not really continuous (check unique(mtcars$hp)), and one 
# can want to see each value of this variable, and not to group it in bins.
ggplot(df, aes(x = factor(V1))) +  
  geom_bar(aes(y = (..count..)/sum(..count..))) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.