2010-11-19 11 views
16

मैं अपने डेटा की गिनती को दर्शाने के लिए geom_point का उपयोग करने का प्रयास कर रहा हूं। मैं geom_text के साथ अपने ग्राफ में कुछ बिंदुओं को एनोटेट करना चाहूंगा। जब मैं geom_text पर कॉल जोड़ता हूं, ऐसा लगता है कि यह किंवदंती में बिंदुओं के नीचे कुछ साजिश कर रहा है। मैंने परतों के क्रम को कोई फायदा नहीं पहुंचाया है। मैं अपने सिर को लपेट नहीं सकता कि यह ऐसा क्यों कर रहा है। क्या किसी ने इसे पहले कभी देखा है?ggplot legend issue w/geom_point और geom_text

set.seed(42) 
df <- data.frame(x = 1:10 
    , y = 1:10 
    , label = sample(LETTERS,10, replace = TRUE) 
    , count = sample(1:300, 10, replace = FALSE) 
) 

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2)) 

alt text

उत्तर

24

यह मेरे लिए हर समय हुआ। यह चाल जानती है कि aes() सौंदर्यशास्त्र के लिए मानचित्र डेटा। यदि मानचित्र पर कोई डेटा नहीं है (उदा।, यदि आपके पास एक एकल मान है जिसे आप निर्धारित करते हैं), aes() का उपयोग करने का कोई कारण नहीं है। मेरा मानना ​​है कि aes() के अंदर केवल चीजें ही आपकी किंवदंती में दिखाई देंगी।

इसके अलावा, जब आप ggplot(aes()) के अंदर मैपिंग निर्दिष्ट करते हैं, तो उन मैपिंग पर प्रत्येक बाद की परत पर लागू होती हैं। यह आपके एक्स और वाई के लिए अच्छा है, क्योंकि geom_point और geom_text दोनों का उपयोग करें। size = count के लिए यह बुरा है, क्योंकि यह केवल अंक पर लागू होता है।

  1. aes() के अंदर केवल डाल डेटा आधारित मैपिंग:

    तो ये बात इस तरह का रोकने के लिए मेरे दो नियम हैं। यदि तर्क एक पूर्व निर्धारित मान ले रहा है, तो इसे के के बाहर परत पर पास करें।

  2. मानचित्र डेटा केवल उन परतों के लिए जो का उपयोग करेंगे। अनुशासनिक: ggplot(aes()) के अंदर केवल मानचित्र डेटा यदि आपको विश्वास है कि प्रत्येक बाद की परत इसका उपयोग करेगी। अन्यथा, इसे परत स्तर पर मानचित्र करें।

तो मैं इस thusly साजिश होगा:

p <- ggplot(data = df, aes(x = x, y = y)) + geom_point(aes(size = count)) 
p + geom_text(aes(label = label), size = 4, vjust = 2) 
+2

आपके दो नियम प्रासंगिक हैं! – kohske

+0

भविष्य के बारे में जानने के लिए बहुत उपयोगी टिप्स, मैं अभी भी अपने सिर को सर्वोत्तम प्रथाओं w/ggplot2 के चारों ओर लपेटने की कोशिश कर रहा हूं। क्या आपके पास डेटा ऑब्जेक्ट को प्लॉट करने के लिए सबसेट करने के लिए कोई सुझाव है? उदाहरण के लिए, यदि आप केवल पहले और अंतिम बिंदु को एनोटेट करना चाहते हैं? मैं 'geom_text (डेटा = डीएफ [grep (" xxx ", df $ लेबल),], aes (x = ...)) जैसे कुछ का उपयोग कर रहा हूं। क्या ऐसा करने के लिए जाने का कोई बेहतर तरीका है? – Chase

+0

चेस - यह एक अच्छा सवाल है। इसके बारे में एक नया सवाल बनाना बुद्धिमान हो सकता है; मेरे पास कुछ अस्पष्ट विचार हैं, लेकिन संभावना है कि किसी और के पास ठोस विचार है। –

17

या, यदि आप एईएस के अंदर पाठ का आकार निर्दिष्ट करने की आवश्यकता है, तो कथा = FALSE दबाने geom की किंवदंतियों ड्राइंग:

p <- ggplot(data = df, aes(x = x, y = y, size = count)) + geom_point() 
p + geom_text(aes(label = label, size = 150, vjust = 2), show_guide = FALSE) 
+1

आह की सुविधा प्रदान करता है, यह परत स्तर पर इसका उपयोग करने के लिए कभी नहीं हुआ। अच्छी तरह से किया। –

+0

यह जानने के लिए एक अच्छी चाल है! धन्यवाद। – Chase

+2

बस एक छोटी सी जानकारी: "किंवदंती" को "show_guides" द्वारा प्रतिस्थापित किया गया है: geom_XXX में "किंवदंती" तर्क और stat_XXX को बहिष्कृत किया गया है। प्रदर्शन के लिए show_guide = TRUE या show_guide = FALSE का उपयोग करें या मार्गदर्शिका डिस्प्ले दबाएं। " – Andreas