2009-11-14 22 views
18

के साथ एक पारेटो चार्ट बनाना ggplot2 पैकेज का उपयोग कर आर में Pareto Chart बनाने के लिए मैं संघर्ष कर रहा हूं। कई मामलों में जब बार चार्ट या हिस्टोग्राम बनाते हैं तो हम एक्स अक्ष द्वारा क्रमबद्ध वस्तुओं को चाहते हैं। एक पारेटो चार्ट में हम चाहते हैं कि आइटम वाई अक्ष में मूल्य से उतरने का आदेश दें। वाई अक्ष में मूल्य द्वारा आदेशित प्लॉट आइटमों के लिए ggplot प्राप्त करने का कोई तरीका है? मैंने पहले डेटा फ्रेम को सॉर्ट करने का प्रयास किया लेकिन ऐसा लगता है कि ggplot उन्हें पीछे रखता है।ggplot2 और R

उदाहरण:

val <- read.csv("http://www.cerebralmastication.com/wp-content/uploads/2009/11/val.txt") 
val<-with(val, val[order(-Value), ]) 
p <- ggplot(val) 
p + geom_bar(aes(State, Value, fill=variable), stat = "identity", position="dodge") + scale_fill_brewer(palette = "Set1") 

डेटा फ्रेम वैल क्रमबद्ध हो जाता है लेकिन उत्पादन इस तरह दिखता है:

alt text http://www.cerebralmastication.com/wp-content/uploads/2009/11/exp.png

हैडली सही ढंग से कहा कि इस वास्तविक बनाम दिखाने के लिए एक बहुत अच्छा ग्राफिक का उत्पादन । भविष्यवाणी:

ggplot(val, aes(State, Value)) + geom_bar(stat = "identity", subset = .(variable == "estimate"), fill = "grey70") + geom_crossbar(aes(ymin = Value, ymax = Value), subset = .(variable == "actual")) 

लौटाता है जो:

alt text http://www.cerebralmastication.com/wp-content/uploads/2009/11/exp1.png

लेकिन यह अभी भी एक Pareto चार्ट नहीं है। कोई सुझाव?

+0

आप सममूल्य (नया) overplotting की चाल का उपयोग कर आधार ग्राफिक्स के साथ ऐसा कर सकते हैं। Ggplot2 मैं मदद नहीं कर सकता (अभी तक, एक दिन शायद मुझे पकड़ने के लिए समय मिल जाएगा)। –

+0

मैं बेस ग्राफिक्स सीखने से बचने के लिए बहुत कठिन प्रयास कर रहा हूं। मैं fantastically आलसी हूँ :) –

उत्तर

15

ggplot2 में बार कारक के स्तरों के क्रम से आदेश दिया जाता है।

val$State <- with(val, factor(val$State, levels=val[order(-Value), ]$State)) 
+0

यह कमाल है! यह वही है जो मैं नहीं समझ सकता कि कैसे करना है। धन्यवाद! –

+4

या थोड़ा और संक्षेप में, अपनी पहली एईएस कॉल को बदलें: 'एईएस (रीडर (स्टेट, वैल्यू), वैल्यू) ' – hadley

+2

मुझे लगता है कि आपको एईएस (रीडर (स्टेट, वैल्यू, मतलब), वैल्यू चाहिए) - क्योंकि दो हैं प्रत्येक राज्य के लिए मूल्य? – Andreas

23

अपने डेटा को सब्सक्राइब करना और सॉर्ट करना;

valact <- subset(val, variable=='actual') 
valsort <- valact[ order(-valact[,"Value"]),] 
वहां से

यह सिर्फ एक मानक boxplot() शीर्ष पर एक बहुत ही मैनुअल संचयी समारोह के साथ:

op <- par(mar=c(3,3,3,3)) 
bp <- barplot(valsort [ , "Value"], ylab="", xlab="", ylim=c(0,1),  
       names.arg=as.character(valsort[,"State"]), main="How's that?") 
lines(bp, cumsum(valsort[,"Value"])/sum(valsort[,"Value"]), 
     ylim=c(0,1.05), col='red') 
axis(4) 
box() 
par(op) 

जो इस

alt text http://dirk.eddelbuettel.com/misc/jdlong_pareto.png

की तरह दिखना चाहिए और यह भी नहीं है ओवरप्लॉटिंग चाल की आवश्यकता है क्योंकि lines() खुशी से आरंभिक साजिश को एनोटेट करता है।

+0

मैंने चांग के जवाब को स्वीकार किया क्योंकि मैं वास्तव में ggplot के साथ ऐसा करना चाहता था। लेकिन मुझे अभी भी आपको एक किक गधा जवाब देने के लिए एक बियर देना है। –

+0

खैर मैंने ggplot2 आवश्यकताओं को याद किया ... –

+0

आपने अपेक्षा की तुलना में पेराटो भाग के जवाब के माध्यम से बहुत अधिक दिया! मेरा सवाल पूरी तरह से स्टाइलिज्ड था और मैंने खुद को कोने में कोड किया था जहां ggplot2 का उपयोग करना सबसे आसान तरीका था। बेस ग्राफिक्स के साथ आपने क्या किया वास्तव में अच्छा था। एक बार फिर धन्यवाद। –

3

इसके अलावा, पैकेज qcc देखें जिसमें एक फ़ंक्शन pareto.chart() है। ऐसा लगता है कि यह बेस ग्राफिक्स का भी उपयोग करता है, इसलिए ggplot2-solution के लिए अपनी बाउंटी शुरू करें :-)

4
एक सरल उदाहरण के साथ

:

> data 
    PC1  PC2  PC3  PC4  PC5  PC6  PC7  PC8  PC9 PC10 
0.29056 0.23833 0.11003 0.05549 0.04678 0.03788 0.02770 0.02323 0.02211 0.01925 

barplot(data) करता चीजों को सही ढंग से

ggplot बराबर "होना चाहिए": qplot(x=names(data), y=data, geom='bar')

लेकिन वह गलत तरीके से reorders/सलाखों वर्णानुक्रम क्रमबद्ध करता है। .. क्योंकि levels(factor(names(data))) का आदेश दिया जाएगा।

समाधान: qplot(x=factor(names(data), levels=names(data)), y=data, geom='bar')

ओह!

1

चीजों को सरल बनाने के लिए, बस केवल अनुमानों पर विचार करें।

estimates <- subset(val, variable == "estimate") 

पहले हम कारक के स्तर को पुन: व्यवस्थित, ताकि State रों Value के घटते क्रम में साजिश रची है।

estimates$State <- with(estimates, reorder(State, -Value)) 

इसी तरह, हम डेटासेट को पुन: व्यवस्थित करते हैं और एक संचयी मान की गणना करते हैं।

estimates <- estimates[order(estimates$Value, decreasing = TRUE),] 
estimates$cumulative <- cumsum(estimates$Value) 

अब हम साजिश खींचने के लिए तैयार हैं। एक ही अक्ष पर एक रेखा और बार प्राप्त करने की चाल राज्य चर (एक कारक) को संख्यात्मक होने के लिए परिवर्तित करना है।

p <- ggplot(estimates, aes(State, Value)) + 
    geom_bar() + 
    geom_line(aes(as.numeric(State), cumulative)) 
p 

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

7

ggplot2 में एक परंपरागत परेटो चार्ट .......

पढ़ने कानो, ई एल, Moguerza, जे.एम., & Redchuk के बाद विकसित, ए (2012)। छह सिग्मा आर के साथ (जी। रॉबर्ट, के। हॉर्निक, & जी। परमिगियानी, एड्स।) स्प्रिंगर। समस्या हमेशा की तरह 'दो y अक्षों के साथ चार्ट' के लिए के रूप में ही दृष्टिकोण -

library(ggplot2);library(grid) 

counts <- c(80, 27, 66, 94, 33) 
defects <- c("price code", "schedule date", "supplier code", "contact num.", "part num.") 
dat <- data.frame(count = counts, defect = defects, stringsAsFactors=FALSE) 
dat <- dat[order(dat$count, decreasing=TRUE),] 
dat$defect <- factor(dat$defect, levels=dat$defect) 
dat$cum <- cumsum(dat$count) 
count.sum<-sum(dat$count) 
dat$cum_perc<-100*dat$cum/count.sum 

p1<-ggplot(dat, aes(x=defect, y=cum_perc, group=1)) 
p1<-p1 + geom_point(aes(colour=defect), size=4) + geom_path() 

p1<-p1+ ggtitle('Pareto Chart')+ theme(axis.ticks.x = element_blank(), axis.title.x = element_blank(),axis.text.x = element_blank()) 
p1<-p1+theme(legend.position="none") 

p2<-ggplot(dat, aes(x=defect, y=count,colour=defect, fill=defect)) 
p2<- p2 + geom_bar() 

p2<-p2+theme(legend.position="none") 

plot.new() 
grid.newpage() 
pushViewport(viewport(layout = grid.layout(2, 1))) 
print(p1, vp = viewport(layout.pos.row = 1,layout.pos.col = 1)) 
print(p2, vp = viewport(layout.pos.row = 2,layout.pos.col = 1)) 
0
freqplot = function(x, by = NULL, right = FALSE) 
{ 
if(is.null(by)) stop('Valor de "by" precisa ser especificado.') 
breaks = seq(min(x), max(x), by = by) 
ecd = ecdf(x) 
den = ecd(breaks) 
table = table(cut(x, breaks = breaks, right = right)) 
table = table/sum(table) 

intervs = factor(names(table), levels = names(table)) 
freq = as.numeric(table/sum(table)) 
acum = as.numeric(cumsum(table)) 

normalize.vec = function(x){ 
    (x - min(x))/(max(x) - min(x)) 
} 

dados = data.frame(classe = intervs, freq = freq, acum = acum, acum_norm = normalize.vec(acum)) 
p = ggplot(dados) + 
    geom_bar(aes(classe, freq, fill = classe), stat = 'identity') + 
    geom_point(aes(classe, acum_norm, group = '1'), shape = I(1), size = I(3), colour = 'gray20') + 
    geom_line(aes(classe, acum_norm, group = '1'), colour = I('gray20')) 

p 
}