2012-04-05 6 views
18

मैं इस अजीब व्यवहार पर ggplot2s के साथ किंवदंतियों के आदेश के साथ ठोकर खाई और सिर्फ यह नहीं समझ सकता कि किंवदंतियों के स्वचालित प्लेसमेंट के पीछे तर्क क्या है है:एकाधिक किंवदंतियों/गाइडों का ऑर्डर करना (स्वचालित तर्क क्या है और इसे कैसे बदला जाए?)

मेरा उद्देश्य: एकाधिक पैमाने के साथ एक साजिश में मैं उन्हें स्वचालित से अलग (विषयगत) क्रम में व्यवस्थित करना चाहता हूं। लेकिन मुझे यह करने के लिए opts() या guides() में कोई आदेश नहीं मिला। और बस स्पष्ट होने के लिए: मैं किंवदंतियों के भीतर वस्तुओं को बदलना नहीं चाहता, जो ठीक काम करता है, लेकिन कई पूर्ण किंवदंतियों की व्यवस्था।

तो पहले मैंने माना कि उन्हें प्रकार, यानी पैमाने, रंग इत्यादि द्वारा आदेश दिया गया था, लेकिन ऐसा नहीं है, उनकी स्थिति बदलती है (नीचे देखें)।

वर्णानुक्रम आदेश? सं

library(ggplot2) ## v0.9 

    ## Scale_colour on top 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "A") + scale_colour_discrete(name = "B") 

    ## Reverse names --> scale_colour on bottom 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "B") + scale_colour_discrete(name = "A") 

    ## Change name B to C --> scale_colour on bottom 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "C") + scale_colour_discrete(name = "A") 

    ## Change name B to D --> scale_colour on top 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "D") + scale_colour_discrete(name = "A") 

scale_colour (के लिए आदान-प्रदान किया scale_size नाम)

  • 'ई' के आगे पदों: नीचे
  • 'एफ' - "L": शीर्ष
  • "एम" - "एन": नीचे

और यह नीचे एक शीर्ष पर दिखाई देता है।

फैक्टोरियल ऑर्डर? सं

## From top to bottom: C - B - A 
    fname <- factor(c("A","B","C"), levels = c("A","B","C")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) + 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

    ## From top to bottom: B - C - A 
    fname <- factor(c("A","B","C"), levels = c("C","B","A")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) + 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

    ## From top to bottom: B - C - A 
    fname <- factor(c("A","B","C"), levels = c("B","C","A")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

शीर्षक की लंबाई? सं। मैं अब उदाहरण कोड के साथ रुक जाऊंगा, लेकिन उस व्यक्ति ने चरित्र की लंबाई से स्वतंत्र उतार-चढ़ाव वाले आदेश भी दिए।

कोई विचार?

+1

दिलचस्प बात यह है कि, उदाहरण के अपने पहले सेट के लिए, प्रत्येक नाम के लिए एक जगह तैयार करना * करता है * किंवदंतियों को वर्णानुक्रम में प्रकट होता है। (यानी .: 'scale_size (नाम =" बी ") + scale_colour_discrete (नाम =" सी ")')। * यह * विधि, फिर से विफल हो जाती है जब दो से अधिक किंवदंतियों की व्यवस्था की जाती है ... –

+1

मुझे इस प्रश्न के उत्तर में बहुत दिलचस्पी होगी, हालांकि मुझे संदेह है कि इसे कोहस्क या हैडली जैसे किसी व्यक्ति की वजन की आवश्यकता होगी। मुझे मेलिंग सूची से इसकी कोई चर्चा नहीं मिली, लेकिन ऐसा कुछ ऐसा लगता है जो किसी बिंदु पर आना चाहिए था। – joran

+0

दुर्भाग्यवश, अब पौराणिक कथाओं का क्रम उनके 'हैश' पर निर्भर करता है, इसलिए आदेश की भविष्यवाणी करने का कोई तरीका नहीं है ... निश्चित रूप से यह मेरे कार्यान्वयन का बुरा विचार है। मैं (या हैडली या डब्ल्यूसीएच) इस समस्या को भविष्य के संस्करण में ठीक कर देगा। – kohske

उत्तर

17

जैसा कि मैंने ऊपर टिप्पणी में उल्लेख किया है, किंवदंती बॉक्स की स्थिति को नियंत्रित करने और भविष्यवाणी करने का कोई तरीका नहीं है। मुझे इस समस्या से अवगत नहीं था। इसे साफ़ करने के लिए धन्यवाद।

हो सकता है कि कुछ लोगों को कथा बॉक्स को नियंत्रित करने की जरूरत है, यहाँ मैं त्वरित सुधार रख:

# run this code before calling ggplot2 function 
guides_merge <- function(gdefs) { 
    gdefs <- lapply(gdefs, function(g) { g$hash <- paste(g$order, g$hash, sep = "z"); g}) 
    tapply(gdefs, sapply(gdefs, function(g)g$hash), function(gs)Reduce(guide_merge, gs)) 
} 
environment(guides_merge) <- environment(ggplot) 
assignInNamespace("guides_merge", guides_merge, pos = "package:ggplot2") 

और फिर आप, guide_legend (और यह भी guide_colorbar) के लिए order तर्क का उपयोग कर सकते

# specify the order of the legend. 
qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
guides(size = guide_legend(order = 1), colour = guide_legend(order = 2), alpha = guide_legend(order = 3)) 

qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
guides(size = guide_legend(order = 3), colour = guide_legend(order = 1), alpha = guide_legend(order = 2)) 

order तर्क एक सकारात्मक पूर्णांक होना चाहिए। किंवदंतियों को क्रम के साथ व्यवस्थित किया जाता है। ध्यान दें कि यह एक त्वरित फिक्स है इसलिए ggplot2 के अगले आधिकारिक संस्करण में इंटरफ़ेस बदला जा सकता है।

+6

कोहस्के इस उत्तर का एक अद्यतन संस्करण प्रदान करता है (जो ggplot2 में लागू परिवर्तनों का उपयोग करता है चूंकि यह उत्तर दिया गया था) http://stackoverflow.com/a/11397958/892313 पर –

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