2013-02-18 24 views
8

मैं ggplot का उपयोग कर आर में एक स्टैक्ड बार ग्राफ प्लॉट करने की कोशिश कर रहा हूं। मैं उस टुकड़े के लिए बार के प्रत्येक टुकड़े में प्रतिशत भी शामिल करना चाहता हूं। मैंने 1, 2, 3 पदों का पालन करने का प्रयास किया लेकिन मूल्य उनके संबंधित ब्लॉक में बिल्कुल नहीं हैं। मेरा डेटा dropbox में एक फ़ाइल है।आर स्टैक्ड बार ग्राफ़ प्लॉटिंग geom_text

मेरे कोड इस प्रकार है:

f<-read.table("Input.txt", sep="\t", header=TRUE) 

ggplot(data=f, aes(x=Form, y=Percentage, fill=Position)) + 
    geom_bar(stat="identity", colour="black") + 
    geom_text(position="stack", aes(x=Form, y=Percentage, ymax=Percentage, label=Percentage, hjust=0.5)) + 
    facet_grid(Sample_name ~ Sample_type, scales="free", space="free") + 
    opts(title = "Input_profile", 
     axis.text.x = theme_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
     plot.title = theme_text(face="bold", size=11), 
     axis.title.x = theme_text(face="bold", size=9), 
     axis.title.y = theme_text(face="bold", size=9, angle=90), 
     panel.grid.major = theme_blank(), 
     panel.grid.minor = theme_blank()) + 
    scale_fill_hue(c=45, l=80) 

ggsave("Output.pdf") 

उत्पादन है-

enter image description here

किसी भी मदद की बहुत सराहना कर रहा है। आपकी मदद और समय के लिए धन्यवाद!

+5

y मूल्य आप 'geom_text' को दे रहे हैं के बारे में सोचो। यह प्रत्येक बार सेगमेंट का _height_ है। आपको प्रत्येक बार सेगमेंट के मिडपॉइंट (या टॉप, या जो भी) की गणना करने के लिए कुछ अंकगणित करने की आवश्यकता है, इसे एक अलग चर के रूप में जोड़ें और इसे 'geom_text' में वाई चर के रूप में उपयोग करें। समारोह 'cumsum' सहायक हो सकता है। – joran

+1

इस तरह कुछ कुछ प्रत्येक बार खंड के मध्य बिंदु पर लेबल के लिए y पदों की गणना करेगा: 'f <- ddply (f,। (फॉर्म, नमूना_नाम, नमूना_ प्रकार), परिवर्तन, pos = (cumsum (प्रतिशत) - 0.5 * प्रतिशत)) '(प्लीयर की आवश्यकता है), फिर 'geom_text' कथन होना चाहिए:' geom_text (aes (x = form, y = pos, label = प्रतिशत)) ' –

उत्तर

9

मुझे लगता है कि आप ggplot2 के पुराने संस्करण का उपयोग कर रहे हैं। क्योंकि के साथ अपने कोड ggplot2 वी 0.9.3 के लिए संशोधित किया, मैं इस मिल:

p <- ggplot(data = df, aes(x = Form, y = Percentage, fill = Position)) 
p <- p + geom_bar(stat = "identity", colour = "black") 
p <- p + geom_text(position = "stack", aes(x = Form, y = Percentage, ymax = Percentage, label = Percentage, hjust = 0.5)) 
p <- p + facet_grid(Sample_name ~ Sample_type, scales="free", space="free") 
p <- p + theme(plot.title = element_text("Input_profile"), 
     axis.text.x = element_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
     plot.title = element_text(face="bold", size=11), 
     axis.title.x = element_text(face="bold", size=9), 
     axis.title.y = element_text(face="bold", size=9, angle=90), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank()) 
p <- p + scale_fill_hue(c=45, l=80) 
p 

ggplot2_text_placement

आप देखते हैं कि पाठ वस्तुओं सामान्य रूप से ठीक से रखा जाता है। ऐसे स्थान हैं जहां बार बहुत कम हैं ताकि संख्याएं ओवरलैप हों। आप size पैरामीटर के साथ भी खेल सकते हैं।

इसे सुधारने के लिए, आप स्वयं को संख्याओं को जोड़ने के लिए ऐसा कुछ कर सकते हैं।

df <- ddply(df, .(Form, Sample_type, Sample_name), transform, 
     cum.perc = Reduce('+', list(Percentage/2,cumsum(c(0,head(Percentage,-1)))))) 

p <- ggplot(data = df, aes(x = Form, y = Percentage, fill = Position)) 
p <- p + geom_bar(stat = "identity", colour = "black") 
p <- p + geom_text(aes(x = Form, y = cum.perc, ymax = cum.perc, label = Percentage, hjust = 0.5), size=2.7) 
p <- p + facet_grid(Sample_name ~ Sample_type, scales="free", space="free") 
p <- p + theme(plot.title = element_text("Input_profile"), 
     axis.text.x = element_text(angle = 90, hjust = 1, size = 8, colour = "grey50"), 
     plot.title = element_text(face="bold", size=11), 
     axis.title.x = element_text(face="bold", size=9), 
     axis.title.y = element_text(face="bold", size=9, angle=90), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank()) 
p <- p + scale_fill_hue(c=45, l=80) 
p 

यह देता है:

ggplot2_facet_text_final

5

यहाँ एक समाधान जाली से barchart का उपयोग कर।

enter image description here

library(latticeExtra) 
barchart(Percentage~Form|Sample_type*Sample_name,data=dat, 
     groups =Position,stack=T, 
     panel=function(...){ 
      panel.barchart(...) 
      ll <- list(...) 
      keep <- !is.na(ll$groups[ll$subscripts]) 
      x <- as.numeric(ll$x[keep]) 
      y <- as.numeric(ll$y[keep]) 
      groups <- as.numeric(factor(ll$groups)[ll$subscripts[keep]]) 
      for (i in unique(x)) { 
       ok <- x == i 
       ord <- sort.list(groups[ok]) 
       pos <- y[ok][ord] > 0 
       nok <- sum(pos, na.rm = TRUE) 
       h <- y[ok][ord][pos] 
       panel.text(x = rep(i, nok),y = cumsum(h)-0.5*h, 
          label = h,cex=1.5) 
      } 
     }, 
     auto.key = list(columns = 5), 
     par.settings = ggplot2like(n = 5), 
     lattice.options = ggplot2like.opts())