दिलचस्प पोस्ट
आरजीबी को सफेद पर आरजीबी में कनवर्ट करें SQL सर्वर: पंक्तियों को स्तंभों में स्थानांतरित करें कैसे कोकाओपॉड के पुराने संस्करण को डाउनग्रेड करना या स्थापित करना जावास्क्रिप्ट और जावा के बीच अंतर क्या है? आप MySQL में "WITH" खंड का प्रयोग कैसे करते हैं? कौन सा ब्राउज़र ECMAScript 6 के लिए आयात और निर्यात वाक्यविन्यास का समर्थन करता है? मैं कैसे जांचूं अगर एक प्रकार एक उपप्रकार या वस्तु का प्रकार है? पायथन में पर्यावरण चर कैसे सेट करें Href = "#" क्या है और इसका इस्तेमाल क्यों किया जाता है? लिनक्स में, मैं एक शेल स्क्रिप्ट कैसे चलाऊँ, जब एक फ़ाइल या निर्देशिका में बदलाव होता है एंड्रॉइड – क्या नेविगेशन ड्रॉवर दाएं हाथ से संभव है? पायथन में समाप्त होने के लिए प्रतीक्षा किए बिना मैं एक और स्क्रिप्ट कैसे चलाऊँ? जावा में अंत में ब्लॉक से लौट रहा है जावा: व्यवस्थापक के रूप में चलाएं HTTP स्थिति 404 – अनुरोधित संसाधन (/) उपलब्ध नहीं है

कैसे ggplot2 में साजिश क्षेत्र के बाहर रेखा खींचें?

मैंने इस प्लॉट को ggplot2 के साथ बनाया है :

यहां छवि विवरण दर्ज करें

बाहर की रेखाओं को Y पैमाने के अनुरूप होना चाहिए, (अर्थात Text1 के लिए लाइनों की Y स्थिति 100 और 85 होनी चाहिए)। एकमात्र तरीका मैं एक खाली भूखंड को चित्र के दायरे के बराबर के साथ barchart के समान चित्रित करके और फिर लाइनों को आकर्षित करने के लिए एनोटेट फ़ंक्शन का उपयोग करके कर सकता हूं। एक और तरीका है कि "मैन्युअल रूप से" grid.lines साथ लाइन grid.lines , हालांकि grid.lines के निर्देशांक साजिश के वाई स्केल के अनुरूप नहीं होंगे।

क्या किसी भी तरह से एक अलग दृष्टिकोण का उपयोग कर इन लाइनों को आकर्षित संभव है? मुझे लगता है कि यह grid.lines साथ किया जाना चाहिए। grid.lines मैं कैसे barchart के y coordinates grid.lines को पारित कर सकता हूं?

नीचे यह आंकड़ा बनाने के लिए इस्तेमाल किया न्यूनतम कोड है:

 library (ggplot2) test= data.frame( group=c(rep(1,6), rep(2,6)), subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2), category=c( rep(1:3, 4)), count=c( 10,80,10,5,90,5, 10,80,10,5,90,5 ) ) qplot(subgroup, count, data=test, geom="bar", stat="identity", fill =category, facets = .~ group, width=0.9)+ opts(legend.position="none", plot.margin = unit(c(0,9,2,0), "lines")) 

यहां छवि विवरण दर्ज करें

मैं सलाखों के दायीं तरफ कैसे रेखा खींच सकता हूं?

मैंने हाल ही में ggplot2 में भूखंड क्षेत्र के बाहर पाठ ड्राइंग के बारे में एक प्रश्न पूछा और समाधान gt$layout और grid.draw का उपयोग करना था

Ggplot2 द्वारा उत्पन्न भूखंड के नीचे पाठ प्रदर्शित करना

क्या इसी तरह का तरीका यहां इस्तेमाल किया जा सकता है? यह मेरी समझ है कि annotation_custom केवल पाठ के लिए है और अन्य ग्राफिकल तत्वों के साथ काम नहीं करेगा। धन्यवाद

वेब के समाधान से एकत्रित समाधान "कैसे ggplot2 में साजिश क्षेत्र के बाहर रेखा खींचें?"

अद्यतन करें

मूल समाधान का उपयोग annotation_custom , लेकिन annotation_custom साथ एक समस्या यह है कि यह सभी पैनलों में एनोटेशन खींचती है। हालांकि, एक साधारण संशोधन के साथ, annotation_custom को केवल एक पैनल में आकर्षित किया जा सकता है (बैप्टिस्ट के उत्तर से लिया गया है )

 annotation_custom2 <- function (grob, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf, data) { layer(data = data, stat = StatIdentity, position = PositionIdentity, geom = ggplot2:::GeomCustomAnn, inherit.aes = TRUE, params = list(grob = grob, xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax)) } library(ggplot2) library(grid) #Some data test = data.frame( group=c(rep(1,6), rep(2,6)), subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2), category=c( rep(1:3, 4)), count=c( 10,80,10,5,90,5, 10,80,10,5,90,5 ) ) # base plot p <- ggplot(test) + geom_bar(aes(subgroup, count, fill = category), stat = "identity") + facet_grid(. ~ group) + theme(legend.position = "none", plot.margin = unit(c(1,5,1,1), "lines")) # Create the text Grobs Text1 = textGrob("Text 1") Text2 = textGrob("Text 2") Text4 = textGrob("Text 4") ## Add the annotations # Which panel to attach the annotations data = data.frame(group=2) # Text 1 p1 = p + annotation_custom2(Text1, xmin = 3., xmax = 3., ymin = 85, ymax = 100, data = data) + annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 100, ymax = 100, data = data) + annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 85, ymax = 85, data = data) + annotation_custom2(linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 85, ymax = 100, data = data) # Text 2 p1 = p1 + annotation_custom2(Text2, xmin = 3, xmax = 3, ymin = 20, ymax = 80, data = data) + annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 80, ymax = 80, data = data) + annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 20, ymax = 20, data = data) + annotation_custom2(linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 20, ymax = 80, data = data) # Text 4 p1 = p1 + annotation_custom2(Text4, xmin = 3, xmax = 3, ymin = 0, ymax = 15, data = data) + annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 15, ymax = 15, data = data) + annotation_custom2(linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 0, ymax = 0, data = data) + annotation_custom2(linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 0, ymax = 15, data = data) # Code to override clipping gt <- ggplotGrob(p1) gt$layout[grepl("panel", gt$layout$name), ]$clip <- "off" # Draw the plot grid.newpage() grid.draw(gt) 

मूल समाधान

मुझे लगता है कि grid() का उपयोग करके लगभग किसी भी Grob को annotation_custom() में उपयोग किया जा सकता है। ऐसा करने के लिए कुछ अच्छे तरीके हो सकते हैं, लेकिन यहां क्लीपींग को ओवरराइड करने के लिए यहां से grid , annotation_custom और @ बप्तिस्मा के कोड का उपयोग करने का एक तरीका है (जैसा कि पहले पोस्ट में है)।

 library (ggplot2) library(grid) test= data.frame( group=c(rep(1,6), rep(2,6)), subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2), category=c( rep(1:3, 4)), count=c( 10,80,10,5,90,5, 10,80,10,5,90,5 ) ) ## EDIT: Updated qplot() command p <- qplot(subgroup, count, data = test, geom = "bar", stat = "identity", fill = category, facets = .~ group, width = 0.9)+ theme(legend.position="none", plot.margin = unit(c(0,9,2,0), "lines")) # Create the text Grobs Text1 = textGrob("Text 1") Text2 = textGrob("Text 2") Text4 = textGrob("Text 4") # Draw the plot # Text 1 p1 = p + annotation_custom(grob = Text1, xmin = 3., xmax = 3., ymin = 85, ymax = 100) + annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 100, ymax = 100) + annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 85, ymax = 85) + annotation_custom(grob = linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 85, ymax = 100) # Text 2 p1 = p1 + annotation_custom(grob = Text2, xmin = 3, xmax = 3, ymin = 20, ymax = 80) + annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 80, ymax = 80) + annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 20, ymax = 20) + annotation_custom(grob = linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 20, ymax = 80) # Text 4 p1 = p1 + annotation_custom(grob = Text4, xmin = 3, xmax = 3, ymin = 0, ymax = 15) + annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 15, ymax = 15) + annotation_custom(grob = linesGrob(), xmin = 2.6, xmax = 2.75, ymin = 0, ymax = 0) + annotation_custom(grob = linesGrob(), xmin = 2.75, xmax = 2.75, ymin = 0, ymax = 15) p1 # Code to override clipping gt <- ggplot_gtable(ggplot_build(p1)) gt$layout$clip[gt$layout$name=="panel"] <- "off" grid.draw(gt) 

यहां छवि विवरण दर्ज करें

मैंने इस लिंक से कोड का इस्तेमाल करते हुए लाइन / टेक्स्ट जोड़े: ggplot2 में grconvertX / grconvertY का उपयोग करना यह दृष्टिकोण grids.text और grid.lines के बजाय grobs का उपयोग करता है मुझे यकीन नहीं है कि कौन से दृष्टिकोण बेहतर है

मुझे लगता है कि grid.lines को grid.polyline कथन में जोड़ा जा सकता है या संभवतः एक पाश के माध्यम से किया जा सकता है। प्रत्येक पंक्ति में हार्डकोडिंग के बजाय एक्स और वाई की स्थिति को एक चर में सेट किया जा सकता है।

एकमात्र संभव जटिलता व्यूपोर्ट में पैमाने पर हो रही है। हालांकि, जब तक एक ही स्केल जीजीपीएलओटी और व्यूपोर्ट में इस्तेमाल किया जाता है, यह कोड काम करना चाहिए। ध्यान दें कि व्यूपोर्ट प्लॉट की पूरी ऊंचाई 0 से 100 तक का उपयोग कर रहा है।

 library (ggplot2) library(grid) library(gridBase) test= data.frame( group=c(rep(1,6), rep(2,6)), subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2), category=c( rep(1:3, 4)), count=c( 10,80,10,5,90,5, 10,80,10,5,90,5 ) ) qplot(subgroup, count, data=test, geom="bar", stat="identity", fill =category, facets = .~ group, width=0.9)+ opts(legend.position="none", plot.margin = unit(c(0,9,2,0), "lines")) current.vpTree() downViewport('panel-4-6') pushViewport(dataViewport( yscale=c(0,100), clip='off',xscale=c(0,1))) grid.text(x=1.21, y = 90, default.units='native' ,label="Text 1") grid.text(x=1.21, y = 55, default.units='native' ,label="Text 2") grid.text(x=1.21, y = 10, default.units='native' ,label="Text 3") grid.lines(x=c(1.02,1.12), y = c(95,95), default.units='native' ) grid.lines(x=c(1.02,1.12), y = c(85, 85), default.units='native' ) grid.lines(x=c(1.12,1.12), y = c(85, 95), default.units='native' ) grid.lines(x=c(1.02,1.12), y = c(80, 80), default.units='native' ) grid.lines(x=c(1.02,1.12), y = c(20, 20), default.units='native' ) grid.lines(x=c(1.12,1.12), y = c(80, 20), default.units='native' ) grid.lines(x=c(1.02,1.12), y = c(5, 5), default.units='native' ) grid.lines(x=c(1.02,1.12), y = c(15, 15), default.units='native' ) grid.lines(x=c(1.12,1.12), y = c(5, 15), default.units='native' ) 

किसी स्वरूपण समस्याओं के लिए माफी – मैंने अपना कोड चिपका लिया और कोड बटन को इंडेंट करने के लिए उपयोग किया।

यहां छवि विवरण दर्ज करें

अद्यतित किए गए opts को नापसंद किया गया है; इसके बजाय theme उपयोग करें

यहाँ एक और समाधान है यह दोनों पैनलों में एनोटेशन_खेल annotation_custom() ड्राइंग ग्रास की समस्या को गोल करता है यह दो रेखांकन खींचता है: पहली बार आपकी बार की साजिश है; दूसरे में केवल एनोटेशन होते हैं फिर दोनों को grid.arrange() से gridExtra पैकेज से एक साथ रखा जाता है। हालांकि, आपकी पॉलीलाइन जारी रहती है

दो भूखंडों में वाई-अक्ष तराजू को प्राप्त करने का मुद्दा अभी भी है। लेकिन ध्यान से, यह किया जा सकता है। प्लॉट जिसमें एननोटेशन शामिल हैं, ध्यान दें कि कैसे y- अक्ष स्तरीय पर असर वाले तत्वों को हटाया नहीं जा सकता है ( theme_blank() माध्यम से, लेकिन वे छिपे हुए हैं ( colour = NA का प्रयोग करके)।

 library(ggplot2) library(gridExtra) library(grid) test= data.frame( group=c(rep(1,6), rep(2,6)), subgroup=c( 1,1,1,2,2,2,1,1,1,2,2,2), category=c( rep(1:3, 4)), count=c( 10,80,10,5,90,5, 10,80,10,5,90,5)) # The bar plot p1 <- ggplot(test, aes(subgroup, count, fill = category)) + geom_bar(stat = "identity") + facet_grid(.~ group) + theme(legend.position = "none", plot.margin = unit(c(1,0,2,0), "lines")) p1 <- p1 + ylim(0, 100) # The empty plot to contain the annotations p2 = ggplot(data.frame(x = c(1,2), y = c(0,100), z = c(1,1)), aes(x,y)) + theme_bw() + facet_wrap(~ z) + theme(axis.title.y = element_blank(), axis.title.x = element_text(colour = NA), axis.text.y = element_blank(), axis.text.x = element_text(colour = NA), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.ticks = element_line(colour = NA), panel.border = element_rect(colour = NA), strip.background = element_rect(colour = NA, fill = NA), strip.text.x = element_text(colour = NA), plot.margin = unit(c(1,0,2,0), "lines")) # The annotations Text1 = textGrob("Text 1") Text2 = textGrob("Text 2") Text4 = textGrob("Text 4") p2 = p2 + annotation_custom(grob = Text1, xmin = 1.4, xmax = 1.4, ymin = 85, ymax = 100) + annotation_custom(grob = linesGrob(), xmin = 1, xmax = 1.1, ymin = 100, ymax = 100) + annotation_custom(grob = linesGrob(), xmin = 1, xmax = 1.1, ymin = 85, ymax = 85) + annotation_custom(grob = linesGrob(), xmin = 1.1, xmax = 1.1, ymin = 85, ymax = 100) p2 = p2 + annotation_custom(grob = Text2, xmin = 1.4, xmax = 1.4, ymin = 20, ymax = 80) + annotation_custom(grob = linesGrob(), xmin = 1, xmax = 1.1, ymin = 80, ymax = 80) + annotation_custom(grob = linesGrob(), xmin = 1, xmax = 1.1, ymin = 20, ymax = 20) + annotation_custom(grob = linesGrob(), xmin = 1.1, xmax = 1.1, ymin = 20, ymax = 80) p2 = p2 + annotation_custom(grob = Text4, xmin = 1.4, xmax = 1.4, ymin = 0, ymax = 15) + annotation_custom(grob = linesGrob(), xmin = 1, xmax = 1.1, ymin = 15, ymax = 15) + annotation_custom(grob = linesGrob(), xmin = 1, xmax = 1.1, ymin = 0, ymax = 0) + annotation_custom(grob = linesGrob(), xmin = 1.1, xmax = 1.1, ymin = 0, ymax = 15) # Putting the two plots together plot = arrangeGrob(p1, p2, ncol = 2, widths = unit(c(10, 2), c("null", "null"))) grid.draw(plot) 

बॉट