2013-02-19 11 views
8

मैं नीचे दिए गए कार्य उदाहरण में df नामक डेटा फ्रेम से x नामक चर के बाहर एक क्वांटाइल-क्वांटाइल प्लॉट का निर्माण कर रहा हूं। मैं अपने df डेटासेट के name चर के साथ अंक लेबल करना चाहता हूं।मैं ggplot2 से बना क्वांटाइल-क्वांटाइल प्लॉट के बिंदु कैसे लेबल कर सकता हूं?

दर्दनाक समाधान (हाथ से सैद्धांतिक वितरण कोडिंग और फिर अनुभवजन्य के खिलाफ प्लॉटिंग) के बिना ggplot2 में ऐसा करना संभव है?

संपादित करें: ऐसा होता है कि हाँ, उपयोगकर्ता द्वारा पोस्ट किया गया और उसके उत्तर को हटा दिया गया। अरुण के उत्तर के बाद टिप्पणियां देखें। ggbuild के साथ अन्यथा चालाक समाधान के लिए Didzis के लिए धन्यवाद।

# MWE 
df <- structure(list(name = structure(c(1L, 2L, 3L, 4L, 5L, 7L, 9L, 
10L, 6L, 12L, 13L, 14L, 15L, 16L, 17L, 19L, 18L, 20L, 21L, 22L, 
8L, 23L, 11L, 24L), .Label = c("AUS", "AUT", "BEL", "CAN", "CYP", 
"DEU", "DNK", "ESP", "FIN", "FRA", "GBR", "GRC", "IRL", "ITA", 
"JPN", "MLT", "NLD", "NOR", "NZL", "PRT", "SVK", "SVN", "SWE", 
"USA"), class = "factor"), x = c(-0.739390016757746, 0.358177826874146, 
1.10474523846099, -0.250589535389937, -0.423112615445571, -0.862144579740376, 
0.823039669834058, 0.079521521937704, 1.08173649722493, -2.03962942823921, 
1.05571087029737, 0.187147291278723, -0.144770773941437, 0.957990771847331, 
-0.0546549555439176, -2.70142550075757, -0.391588386498849, -0.23855544527369, 
-0.242781575907386, -0.176765072121165, 0.105155860923456, 2.69031085872414, 
-0.158320176671995, -0.564560815972446)), .Names = c("name", 
"x"), row.names = c(NA, -24L), class = "data.frame") 

library(ggplot2) 
qplot(sample = x, data = df) + geom_abline(linetype = "dotted") + theme_bw() 

# ... using names instead of points would allow to spot the outliers 

मैं this gist पर आधारित एक फिल्म पर काम कर रहा हूँ, और अगर मैं प्रतिगमन निदान, जो सीवी उपयोगकर्ताओं के लिए ब्याज की हो सकता है के बारे में प्रश्न CrossValidated को अन्य प्रश्न भेजने पर विचार करेगी।

+0

किसी Didzis से भी सीधा समाधान पोस्ट और इसे नष्ट कर दिया। यह 'ggplot (डीएफ, एईएस (नमूना = एक्स)) + geom_text (लेबल = डीएफ $ नाम, स्टेट = "qq") + geom_abline (linetype = "dotted") की तरह कुछ था। यदि आप रुचि रखते हैं। – Arun

उत्तर

8

आप वस्तु (प्रयुक्त समारोह ggplot() और qplot() के बजाय stat_qq()) के रूप में अपने मूल QQ साजिश

g<-ggplot(df, aes(sample = x)) + stat_qq() 

तब समारोह ggplot_build() के साथ साजिश रचने के लिए इस्तेमाल किया डेटा निकाल सकते हैं बचा सकता है। वे तत्व data[[1]] में संग्रहीत हैं। उन डेटा को नए डेटा फ्रेम के रूप में सहेजा गया।

df.new<-ggplot_build(g)$data[[1]] 
head(df.new) 
      x   y  sample theoretical PANEL group 
1 -2.0368341 -2.7014255 -2.7014255 -2.0368341  1  1 
2 -1.5341205 -2.0396294 -2.0396294 -1.5341205  1  1 
3 -1.2581616 -0.8621446 -0.8621446 -1.2581616  1  1 
4 -1.0544725 -0.7393900 -0.7393900 -1.0544725  1  1 
5 -0.8871466 -0.5645608 -0.5645608 -0.8871466  1  1 
6 -0.7415940 -0.4231126 -0.4231126 -0.7415940  1  1 

अब आप अवलोकन के डेटा फ्रेम नामों को जोड़ सकते हैं। order() का उपयोग करना महत्वपूर्ण है क्योंकि नए डेटा फ्रेम में डेटा का ऑर्डर दिया गया है।

df.new$name<-df$name[order(df$x)] 

अब हमेशा की तरह नए डेटा फ्रेम साजिश और geom_point() के बजाय geom_text() प्रदान करते हैं।

ggplot(df.new,aes(theoretical,sample,label=name))+geom_text()+ 
    geom_abline(linetype = "dotted") + theme_bw() 

enter image description here

+0

(+1) 'ggplot_build()' का शानदार उपयोग। एक सवाल: मैं इस तरह के 'ggplot2' के निचले स्तर के नियंत्रण के बारे में कहां पढ़ सकता हूं, कोई विचार ?? – Arun

+1

@ अरुण मुझे यकीन नहीं है कि जानकारी कहां मिलें - मैंने अन्य SO प्रश्नों को देखकर यह सीखा है –

+0

ओह ठीक है, यह अच्छा है। मैं तब आपके उत्तरों की तलाश रखूंगा! :) – Arun

5

अंक बहुत करीब हैं। मैं कुछ इस तरह करना होगा:

df <- df[with(df, order(x)), ] 
df$t <- quantile(rnorm(1000), seq(0, 100, length.out = nrow(df))/100) 

p <- ggplot(data = df, aes(x=t, y=x)) + geom_point(aes(colour=df$name)) 

यह देता है:

enter image description here

आप साजिश के अंदर लेबल होने पर जोर देते हैं, तो, आप की तरह कुछ की कोशिश कर सकते:

df <- df[with(df, order(x)), ] 
df$t <- quantile(rnorm(1000), seq(0, 100, length.out = nrow(df))/100) 

p <- ggplot(data = df, aes(x=t, y=x)) + geom_point(aes(colour=df$name)) 
p <- p + geom_text(aes(x=t-0.05, y=x-0.15, label=df$name, size=1, colour=df$name)) 

p 

enter image description here

आप चारों ओर खेल सकते हैं x और y निर्देशांक के साथ और यदि आप चाहते हैं कि आप हमेशा रंग सौंदर्यशास्त्र को हटा सकें।

+0

+1 अच्छा इंद्रधनुष रंग :) मुझे लगता है कि आपकी दूसरी साजिश के लिए कोड गुम है? – juba

+0

@ जुबा, ओप्सी! इसे पेस्ट करने के लिए भूल गए।इंगित करने के लिए धन्यवाद! – Arun

+0

आपके सुझाव के लिए धन्यवाद। मैंने उस अंतिम समाधान के बारे में सोचा, लेकिन साजिश के लिए अतिरिक्त 'rnorm' डेटा के निर्माण के बिना करना चाहता हूं। –

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

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