तो थोड़ी देर के लिए इस बारे में सोच रहा था।
- एक परत-समारोह
- एक स्टेट-ggproto,
- एक 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)
और वे इस तरह दिखेगा:
नोट: हमें वास्तव में layer
फ़ंक्शन का उपयोग नहीं करना पड़ा था, हम मूल स्थान stat_boxplot
, geom_boxplot
, और stat_summary
कॉल को उनके स्थान पर इस्तेमाल कर सकते थे। लेकिन अगर हम अपने कस्टम बॉक्सप्लॉट से उन्हें नियंत्रित करने में सक्षम होना चाहते हैं, तो हमें अभी भी सभी मानकों को भरना होगा, इसलिए मुझे लगता है कि यह इस तरह से स्पष्ट था - कम से कम संरचना के बिंदु के रूप में कार्यक्षमता के विपरीत । शायद यह नहीं है, यह स्वाद का विषय है ...
इसके अलावा मेरे पास वह फ़ॉन्ट नहीं है जो बहुत अच्छा दिखता है। लेकिन मुझे इसे ट्रैक करने और इसे स्थापित करने की तरह महसूस नहीं हुआ।
तो आपको क्या लगता है? –
ग्रेट धन्यवाद, @ माइकवाइज! अपने उत्तर के लिए टिप्पणी देखें। – UlvHare
एर, कौन टिप्पणी? और यदि आप इसे पसंद करते हैं, तो क्या आप जवाब स्वीकार कर सकते हैं? ऐसा करने के लिए, मेरे उत्तर के ऊपरी-बाएं पास के पास वोट-नंबर के नीचे ग्रे चेक-मार्क पर क्लिक करें। –