2012-07-22 6 views
12

मुझे geom_bar() और position="dodge" समझने में काफी समय लगता है। मैं दो समूहों को चित्रित करने वाले कुछ बार ग्राफ बनाने की कोशिश कर रहा था। मूल रूप से डेटा दो अलग-अलग डेटा फ्रेम से था। प्रति this question, मैंने अपना डेटा लंबे प्रारूप में रखा है। मेरा उदाहरण:ggplot2, geom_bar, और position = "dodge" के साथ समस्या: ढेर में सही y मान हैं, dodged

test <- data.frame(names=rep(c("A","B","C"), 5), values=1:15) 
test2 <- data.frame(names=c("A","B","C"), values=5:7) 

df <- data.frame(names=c(paste(test$names), paste(test2$names)), num=c(rep(1, 
nrow(test)), rep(2, nrow(test2))), values=c(test$values, test2$values)) 

मैं उस उदाहरण का उपयोग करता हूं क्योंकि यह व्यय बनाम बजट उदाहरण के समान है। व्यय में names कारक स्तर पर कई पंक्तियां हैं जबकि बजट में केवल एक (प्रति वर्ग एक बजट राशि) है।

एक स्टैक्ड बार भूखंड के लिए, यह महान काम करता है:

ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
geom_bar(stat="identity") 

stacked plot

विशेष रूप से, ध्यान दें y मूल्य maxes। वे test से डेटा की रकम हैं जो शीर्ष पर नीले रंग पर दिखाए गए test2 के मानों के साथ हैं।

ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
geom_bar(stat="identity", position="dodge") 

dodged

यह बहुत अच्छा लग रहा है:

अन्य प्रश्न मैं पढ़ा है के आधार पर, मैं बस यह एक साइड-बाई-साइड साजिश बनाम एक खड़ी एक बनाने के लिए position="dodge" जोड़ने की जरूरत , लेकिन नए अधिकतम वाई मानों को नोट करें। ऐसा लगता है कि यह वाई मान के लिए test से प्रत्येक नाम कारक स्तर से अधिकतम वाई मान ले रहा है। यह अब उन्हें संक्षेप में नहीं है।

ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) + 
geom_bar(stat="identity", position="dodge") 

मुझे समझ नहीं आता क्यों खड़ी काम करता है महान:

कुछ अन्य सवालों के प्रति (जैसे this one और this one, मैं भी सफलता नहीं मिली group= विकल्प (जैसा कि ऊपर एक ही टाल साजिश का उत्पादन) जोड़ने की कोशिश की और टाल सिर्फ उन्हें कंधे से बजाय की चोटी पर पक्ष नहीं करता है


अनुमानित समय। मैं पर इस बारे में एक recent question पाया क्या हो रहा है यह देखने के लिए alpha=0.5 जोड़ने के सुझाव के साथ ggplot google समूह। ऐसा नहीं है कि ggplot प्रत्येक समूह से अधिकतम मूल्य ले रहा है; यह वास्तव में प्रत्येक मूल्य के लिए एक दूसरे के ऊपर सलाखों को ओवर-प्लॉटिंग करता है।

ऐसा लगता है कि position="dodge" का उपयोग करते समय, ggplot केवल x y प्रति x की अपेक्षा करता है। मैंने विंस्टन चांग से संपर्क किया, इसके बारे में पुष्टि करने के लिए एक जीजीप्लॉट डेवलपर के साथ-साथ यह पूछने के लिए कि क्या इसे बदला जा सकता है क्योंकि मुझे कोई लाभ नहीं दिख रहा है।

ऐसा लगता है कि stat="identity" हिसाब करने के y=val व्यक्ति मायने रखता है जो stat="identity" बिना होता है और जब कोई y मूल्य गुजर के बजाय aes() अंदर पारित कर दिया ggplot बताना चाहिए।

अभी के लिए, वैकल्पिक हल (ऊपर मूल df के लिए) एकत्र करने के लिए हो रहा है तो वहाँ प्रति एक्स केवल एक y है:

df2 <- aggregate(df$values, by=list(df$names, df$num), FUN=sum) 
p <- ggplot(df2, aes(x=Group.1, y=x, fill=factor(Group.2))) 
p <- p + geom_bar(stat="identity", position="dodge") 
p 

correct

उत्तर

16

मुझे लगता है कि समस्या यह है कि आप करना चाहते हैं num समूह के मूल्यों के भीतर, और num के मानों के बीच के भीतर। यह देखने में मदद कर सकता है कि जब आप बार में रूपरेखा जोड़ते हैं तो क्या होता है।

library(ggplot2) 
set.seed(123) 
df <- data.frame(
    id  = 1:18, 
    names = rep(LETTERS[1:3], 6), 
    num = c(rep(1, 15), rep(2, 3)), 
    values = sample(1:10, 18, replace=TRUE) 
) 

डिफ़ॉल्ट रूप से, देखते हैं खड़ी सलाखों के एक बहुत - तुम सिर्फ नहीं दिख रहा है कि वे अलग कर रहे हैं जब तक आप एक रूपरेखा है:

# Stacked bars 
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
    geom_bar(stat="identity", colour="black") 

Stacked bars

आप चकमा हैं , आप सलाखों कि num के मूल्यों के बीच टाल रहे हैं, लेकिन वहाँ num के प्रत्येक मान के भीतर कई बार हो सकता है:

# Dodged on 'num', but some overplotted bars 
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
    geom_bar(stat="identity", colour="black", position="dodge", alpha=0.1) 

Dodged on num

आप भी एक समूहीकरण वर के रूप में id जोड़ेंगे, तो वह उन सभी को चकमा होगी:

# Dodging with unique 'id' as the grouping var 
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(id))) + 
    geom_bar(stat="identity", colour="black", position="dodge", alpha=0.1) 

Dodge all bars

मुझे लगता है कि क्या आप चाहते हैं दोनों चकमा और ढेर है, लेकिन आप दोनों नहीं कर सकते हैं। तो सबसे अच्छी बात यह है कि डेटा को सारांशित करना है।

library(plyr) 
df2 <- ddply(df, c("names", "num"), summarise, values = sum(values)) 

ggplot(df2, aes(x=factor(names), y=values, fill=factor(num))) + 
    geom_bar(stat="identity", colour="black", position="dodge") 

Summarized beforehand

+0

समझ गया। यह आपके लिए यह इंगित करने में काफी मददगार था कि मैं वास्तव में दोनों डोडिंग और स्टैकिंग के लिए पूछ रहा हूं। एक quibble: जब 'stat =" पहचान "' (मूल रूप से एक हिस्टोग्राम बनाने) का उपयोग नहीं करते हैं, तो कुछ अन्य विशेषताओं के बीच डोजिंग करते समय व्यक्तिगत गणनाओं को "stacking" ggplot नहीं है? फिर भी, मैं जवाब के साथ ठीक हूं कि यह इस समय काम करता है। मैंने सोचा कि मैं अपने कोड में कुछ गलत कर रहा था! – Hendy

+2

'geom_bar' थोड़ा उलझन में हो सकता है क्योंकि इसका उपयोग दो अलग-अलग उद्देश्यों के लिए किया जाता है: कभी-कभी इसका उपयोग आपके द्वारा प्रदान किए जाने वाले वाई मानों को साजिश करने के लिए किया जाता है, और कभी-कभी यह प्रत्येक में मामलों की संख्या की गणना करता है और उस मान को y मान के रूप में उपयोग करता है (' स्टेट = "बिन" ')। बाद वाला व्यवहार डिफ़ॉल्ट है (आप इसे 'ggplot (df, aes (x = factor (names), fill = factor (num) के साथ देख सकते हैं)) + geom_bar (रंग = "काला") ')। इस मामले में, "स्टैकिंग" काफी समान नहीं है - यह सारांश _stat_ है, जबकि सामान्य स्टैकिंग _position समायोजन_ है। ये चीजें ggplot पाइपलाइन के विभिन्न चरणों में होती हैं। स्पष्टीकरण के लिए – wch

+0

धन्यवाद। एकत्रित करना एक बड़ा सौदा नहीं है और अब मुझे पता है कि मुझे इसकी आवश्यकता है, जो भ्रमित होने से एक बड़ा कदम है :) – Hendy

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