2016-01-19 6 views
5

मैं अक्सर अपने काम में बॉक्सप्लॉट का उपयोग कर रहा हूं और ggplot2 सौंदर्यशास्त्र जैसे। लेकिन मानक geom_boxplot में मेरे लिए दो चीजें महत्वपूर्ण हैं: व्हिस्कर्स और औसत लेबल के सिरों। धन्यवाद यहाँ से जानकारी के लिए मैं एक समारोह में लिखा है:ggprot2 boxplot ggproto के साथ कैसे विस्तार करें?

gBoxplot <- function(formula = NULL, data = NULL, font = "CMU Serif", fsize = 18){ 
    require(ggplot2) 
    vars <- all.vars(formula) 
    response <- vars[1] 
    factor <- vars[2] 
    # A function for medians labelling 
    fun_med <- function(x){ 
    return(data.frame(y = median(x), label = round(median(x), 3))) 
    } 
    p <- ggplot(data, aes_string(x = factor, y = response)) + 
    stat_boxplot(geom = "errorbar", width = 0.6) + 
    geom_boxplot() + 
    stat_summary(fun.data = fun_med, geom = "label", family = font, size = fsize/3, 
                     vjust = -0.1) + 
    theme_grey(base_size = fsize, base_family = font) 
    return(p) 
} 

वहाँ भी फ़ॉन्ट सेटिंग्स, लेकिन यह है कि सिर्फ इसलिए कि मैं भी एक विषय बनाने के लिए आलसी हूँ। यहाँ एक उदाहरण है:

gBoxplot(hwy ~ class, mpg) 

plot1

मेरे लिए अच्छा पर्याप्त हैं, लेकिन कुछ restrictictions (ऑटो चकमा दे रहा है, आदि का उपयोग नहीं कर सकते हैं) हैं, और यह एक नया geom के आधार पर बनाने के लिए बेहतर होगा geom_boxplot। मैंने विग्नेट Extending ggplot2 पढ़ा है, लेकिन यह समझ में नहीं आता कि इसे कैसे कार्यान्वित किया जाए। किसी भी मदद की सराहना की जाएगी।

+0

तो आपको क्या लगता है? –

+0

ग्रेट धन्यवाद, @ माइकवाइज! अपने उत्तर के लिए टिप्पणी देखें। – UlvHare

+0

एर, कौन टिप्पणी? और यदि आप इसे पसंद करते हैं, तो क्या आप जवाब स्वीकार कर सकते हैं? ऐसा करने के लिए, मेरे उत्तर के ऊपरी-बाएं पास के पास वोट-नंबर के नीचे ग्रे चेक-मार्क पर क्लिक करें। –

उत्तर

6

तो थोड़ी देर के लिए इस बारे में सोच रहा था।

  1. एक परत-समारोह
  2. एक स्टेट-ggproto,
  3. एक geom-ggproto
: मूल रूप से जब आप एक नया आदिम बनाने के लिए, आप सामान्य रूप से का एक संयोजन बारे में

केवल परत-फ़ंक्शन उपयोगकर्ता को दिखाई देने की आवश्यकता है। आपको केवल stat-ggproto लिखने की आवश्यकता है यदि आपको अपने आदिम को बनाने के लिए अपने डेटा को बदलने का कुछ नया तरीका चाहिए। और यदि आपके पास बनाने के लिए कुछ नए ग्रिड-आधारित ग्राफिक्स हैं तो आपको केवल geom-ggproto लिखने की आवश्यकता है।

इस मामले में, जहां हम मूल रूप से परत-फ़ंक्शन कंपोस्टिंग कर रहे हैं जो पहले से मौजूद है, हमें वास्तव में नए ggprotos लिखने की आवश्यकता नहीं है। यह एक नया परत-फ़ंक्शन लिखने के लिए पर्याप्त है। यह परत-फ़ंक्शन तीन परतों को बनाएगा जो आप पहले से ही उपयोग कर रहे हैं और पैरामीटर को जिस तरह से आप चाहते हैं उसे मैप करें। इस मामले में:

  • Layer1 - का उपयोग करता geom_errorbar और stat_boxplot - हमारे errorbars पाने के लिए
  • Layer2 - geom_boxplot और stat_boxplot उपयोग करता है - उन geom_label और stat_summary - - पाठ लेबल बनाने के लिए boxplots
  • layer3 बनाने के लिए बक्से के केंद्र में औसत मूल्य के साथ।

बेशक आप एक नया स्टेट-ggproto और एक नया geom-ggproto एक ही बार में इन बातों के सभी करते हैं कि लिख सकते हैं। या हो सकता है कि आप stat_summary और stat_boxplot को एक में कंपोस्ट करें, और तीन geom-protos साथ ही, और यह एक परत के साथ ऐसा करता है। लेकिन जब तक हमारे पास दक्षता की समस्या नहीं है तब तक थोड़ा बिंदु है।

geom_myboxplot <- function(formula = NULL, data = NULL, 
          stat = "boxplot", position = "dodge",coef=1.5, 
          font = "sans", fsize = 18, width=0.6, 
          fun.data = NULL, fun.y = NULL, fun.ymax = NULL, 
          fun.ymin = NULL, fun.args = list(), 
          outlier.colour = NULL, outlier.color = NULL, 
          outlier.shape = 19, outlier.size = 1.5,outlier.stroke = 0.5, 
          notch = FALSE, notchwidth = 0.5,varwidth = FALSE, 
          na.rm = FALSE, show.legend = NA, 
          inherit.aes = TRUE,...) { 
    vars <- all.vars(formula) 
    response <- vars[1] 
    factor <- vars[2] 
    mymap <- aes_string(x=factor,y=response) 
    fun_med <- function(x) { 
     return(data.frame(y = median(x), label = round(median(x), 3))) 
    } 
    position <- position_dodge(width) 
    l1 <- layer(data = data, mapping = mymap, stat = StatBoxplot, 
      geom = "errorbar", position = position, show.legend = show.legend, 
      inherit.aes = inherit.aes, params = list(na.rm = na.rm, 
       coef = coef, width = width, ...)) 
    l2 <- layer(data = data, mapping = mymap, stat = stat, geom = GeomBoxplot, 
      position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
      params = list(outlier.colour = outlier.colour, outlier.shape = outlier.shape, 
       outlier.size = outlier.size, outlier.stroke = outlier.stroke, 
       notch = notch, notchwidth = notchwidth, varwidth = varwidth, 
       na.rm = na.rm, ...)) 
    l3 <- layer(data = data, mapping = mymap, stat = StatSummary, 
      geom = "label", position = position, show.legend = show.legend, 
      inherit.aes = inherit.aes, params = list(fun.data = fun_med, 
       fun.y = fun.y, fun.ymax = fun.ymax, fun.ymin = fun.ymin, 
       fun.args = fun.args, na.rm=na.rm,family=font,size=fsize/3,vjust=-0.1,...)) 
    return(list(l1,l2,l3)) 
} 

जो आप इस तरह अब अपने अनुकूलित boxplots इसे बनाने के लिए अनुमति देता है:

वैसे भी, यहाँ कोड है

ggplot(mpg) + 
    geom_myboxplot(hwy ~ class, font = "sans",fsize = 18)+ 
    theme_grey(base_family = "sans",base_size = 18) 

और वे इस तरह दिखेगा:

enter image description here

नोट: हमें वास्तव में layer फ़ंक्शन का उपयोग नहीं करना पड़ा था, हम मूल स्थान stat_boxplot, geom_boxplot, और stat_summary कॉल को उनके स्थान पर इस्तेमाल कर सकते थे। लेकिन अगर हम अपने कस्टम बॉक्सप्लॉट से उन्हें नियंत्रित करने में सक्षम होना चाहते हैं, तो हमें अभी भी सभी मानकों को भरना होगा, इसलिए मुझे लगता है कि यह इस तरह से स्पष्ट था - कम से कम संरचना के बिंदु के रूप में कार्यक्षमता के विपरीत । शायद यह नहीं है, यह स्वाद का विषय है ...

इसके अलावा मेरे पास वह फ़ॉन्ट नहीं है जो बहुत अच्छा दिखता है। लेकिन मुझे इसे ट्रैक करने और इसे स्थापित करने की तरह महसूस नहीं हुआ।

+0

मैंने किसी भी उत्तर के लिए आशा खो दी है, तो अभी अभी अपना देखें। वास्तव में यह बहुत ही बात है: काम करने का उदाहरण और कुछ सिद्धांत के बारे में सोचने के लिए। विचार को ध्यान में रखने के लिए कुछ समय चाहिए (अंग्रेजी मेरी मातृभाषा नहीं है)। मैं जिस फ़ॉन्ट का उपयोग करता हूं वह है [कंप्यूटर मॉडर्न यूनिकोड] (http://cm-unicode.sourceforge.net/), डी। Knuth के क्लासिक का एक यूनिकोड संस्करण। – UlvHare

+0

ग्रेट। खुश हूँ कि आपने इसे पसंद किया। हालांकि उत्तर को स्वीकार करें। –

+0

धन्यवाद। यदि आपके पास दो और अंक थे तो आप इसे भी ऊपर उठा सकते थे। शायद अगली बार :) –

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