2011-06-14 19 views
8

का उपयोग कर क्वांटाइल के साथ एक समय श्रृंखला प्लॉट करें मुझे ggplot2 के साथ एक समय श्रृंखला प्लॉट करने की आवश्यकता है। समय श्रृंखला के प्रत्येक बिंदु के लिए मेरे पास कुछ क्वांटाइल भी हैं, 0.05, 0.25, 0.75, 0.95 कहें, यानी मेरे पास प्रत्येक बिंदु के लिए पांच डेटा हैं। उदाहरण के लिए:आर: ggplot2

time   quantile=0.05 quantile=0.25 quantile=0.5 quantile=0.75 quantile=0.95 
00:01   623.0725  630.4353  903.8870  959.1407  1327.721 
00:02   623.0944  631.3707  911.9967  1337.4564  1518.539 
00:03   623.0725  630.4353  903.8870  1170.8316  1431.893 
00:04   623.0725  630.4353  903.8870  1336.3212  1431.893 
00:05   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:06   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:07   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:08   623.0780  631.3483  905.3496  1056.3719  1375.610 
00:09   623.0671  630.4275  903.8839  1170.8196  1356.963 
00:10   623.0507  630.0261  741.8475  1006.1208  1462.271 

आदर्श रूप में, मैं एक काले रंग की लाइन के रूप में 0.5 quantile और काली रेखा के आसपास के छायांकित रंग अंतराल के रूप में दूसरों के लिए करना चाहते हैं। ऐसा करने का सबसे अच्छा तरीका क्या है? मैं भाग्य के साथ चारों ओर देख रहा हूं, मुझे इसका उदाहरण नहीं मिल रहा है, ggplot2 के साथ भी कम।

किसी भी मदद की सराहना की जाएगी।

सलाद!

+2

हमें खेलने के लिए कुछ डेटा दें। यहां एक महान प्रतिलिपि बनाने के उदाहरण के बारे में कुछ दिशानिर्देश दिए गए हैं: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

उत्तर

9

आप यही चाहते करना है: इस प्रकार मैं अपने डेटा निर्मित? ggplot की चाल यह समझ रही है कि यह लंबे प्रारूप में डेटा की अपेक्षा करता है। इसका अक्सर अर्थ है कि हमें साजिश के लिए तैयार होने से पहले डेटा को बदलना होगा, आमतौर पर melt() के साथ।

यहाँ textConnection() साथ में अपने डेटा को पढ़ने और एक वस्तु dat नामित बनाने, के बाद कदम उठाने चाहते हैं:

#Melt into long format 
dat.m <- melt(dat, id.vars = "time") 

#Not necessary, but if you want different line types depending on quantile, here's how I'd do it 
dat.m <- within(dat.m 
    , lty <- ifelse(variable == "quantile.0.5", 1 
    , ifelse(variable %in% c("quantile.0.25", "quantile.0.75"),2,3) 
    ) 
) 

#plot it 
ggplot(dat.m, aes(time, value, group = variable, colour = variable, linetype = lty)) + 
    geom_line() + 
    scale_colour_manual(name = "", values = c("red", "blue", "black", "blue", "red")) 

आप देता है:

enter image description here

अपने प्रश्न पढ़ने के बाद फिर, शायद आप रेखाओं के बजाय औसत अनुमान के बाहर छायांकित रिबन चाहते हैं? यदि हां, तो इसे एक भंवर दें। यहां एकमात्र असली चाल यह है कि हम group = 1 को सौंदर्यशास्त्र के रूप में पास करते हैं ताकि geom_line() कारक/चरित्र डेटा के साथ ठीक से व्यवहार करेगा। पहले, हम चर द्वारा समूहित किया गया था जो एक ही प्रभाव परोसता था। यह भी ध्यान रखें कि अब हम melt एड डेटा.फ्रेम का उपयोग नहीं कर रहे हैं, क्योंकि विस्तृत डेटा.फ्रेम इस मामले में हमें ठीक करेगा।

ggplot(dat, aes(x = time, group = 1)) + 
    geom_ribbon(aes(ymin = quantile.0.05, ymax = quantile.0.95, fill = "05%-95%"), alpha = .25) + 
    geom_ribbon(aes(ymin = quantile.0.25, ymax = quantile.0.75, fill = "25%-75%"), alpha = .25) + 
    geom_line(aes(y = quantile.0.5)) + 
    scale_fill_manual(name = "", values = c("25%-75%" = "red", "05%-95%" = "blue")) 

enter image description here

संपादित करें: भविष्यवाणी की मूल्य

के लिए एक किंवदंती बाध्य करने के लिए हम एक ही दृष्टिकोण हम geom_ribbon() परतों के लिए इस्तेमाल कर सकते हैं।हम scale_colour_manual() साथ geom_line() को एक सौंदर्य जोड़ देंगे और फिर उस सौंदर्य का मान सेट:

ggplot(dat, aes(x = time, group = 1)) + 
    geom_ribbon(aes(ymin = quantile.0.05, ymax = quantile.0.95, fill = "05%-95%"), alpha = .25) + 
    geom_ribbon(aes(ymin = quantile.0.25, ymax = quantile.0.75, fill = "25%-75%"), alpha = .25) + 
    geom_line(aes(y = quantile.0.5, colour = "Predicted")) + 
    scale_fill_manual(name = "", values = c("25%-75%" = "red", "05%-95%" = "blue")) + 
    scale_colour_manual(name = "", values = c("Predicted" = "black")) 

वहाँ और अधिक कुशल तरीके कि ऐसा करने के लिए, लेकिन हो सकता है कि जिस तरह से मैं हमेशा उपयोग किया है और बहुत अच्छी पड़ा है है इसके साथ सफलता YMMV।

+0

ggplot उत्तर लंदन बसों की तरह हैं। आप दृष्टि में कुछ भी नहीं के साथ तीन घंटे इंतजार कर सकते हैं, और फिर अचानक आपके पास 6 मिनट के अंदर दो हैं! पुनश्च। +1 – Andrie

+0

कुछ साल पहले जुबजाना में बसों की तरह लगता है। :) –

+0

वाह, यह बिल्कुल सही है! आपका बहुत बहुत धन्यवाद! केवल एक चीज जो मुझे जोड़ने की आवश्यकता होगी वह लाइन के लिए एक किंवदंती है जो "अनुमानित मान" पढ़ती है। ऐसा कैसे किया जा सकता था? क्या मैं scale_fill_manual को अन्य scale_manual के साथ जोड़ सकता हूं? एक बार फिर धन्यवाद! – jla

5

अपने dat.frame मान लिया जाये कि df कहा जाता है:

सबसे आसान ggplot समाधान boxplot geom उपयोग करने के लिए है। यह मध्य और ऊपरी स्थितियों में भरे हुए बक्से के साथ एक काला केंद्रीय रेखा देता है।

ggplot(df, aes(x=time)) + 
    geom_boxplot(
     aes(
      lower=quantile.0.25, 
      upper=quantile.0.75, 
      middle=quantile.0.5, 
      ymin=quantile.0.05, 
      ymax=quantile.0.95 
     ), 
     stat="identity", 
     fill = "cyan" 
) 

enter image description here

पुनश्च:

आप अपने डेटा पूर्व संक्षेपण किया है के बाद से, यह stat="identity" पैरामीटर निर्दिष्ट करने के लिए महत्वपूर्ण है।

df <- "time   quantile=0.05 quantile=0.25 quantile=0.5 quantile=0.75 quantile=0.95 
00:01   623.0725  630.4353  903.8870  959.1407  1327.721 
00:02   623.0944  631.3707  911.9967  1337.4564  1518.539 
00:03   623.0725  630.4353  903.8870  1170.8316  1431.893 
00:04   623.0725  630.4353  903.8870  1336.3212  1431.893 
00:05   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:06   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:07   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:08   623.0780  631.3483  905.3496  1056.3719  1375.610 
00:09   623.0671  630.4275  903.8839  1170.8196  1356.963 
00:10   623.0507  630.0261  741.8475  1006.1208  1462.271" 

df <- read.table(textConnection(df), header=TRUE) 
+0

हमम - हमने अपना प्रश्न अलग-अलग व्याख्या किया है ... इसे फिर से पढ़ने के बाद, मुझे यकीन नहीं है कि यहां सही रास्ते पर कौन है! भले ही, अच्छा काम बॉक्स प्लॉट मैन्युअल रूप से कैसे बनाएं। +1 – Chase

+0

हाँ, मुझे लाइन और रिबन शैली में अधिक दिलचस्पी थी, क्योंकि मेरी श्रृंखला लंबी है। लेकिन वैसे भी धन्यवाद, मैंने कुछ और सीखा! :) – jla