2013-06-17 6 views
16

मैं दो रेखांकन है कि मैं अन्य के ऊपर एक रखकर कर रहा हूँ निम्नलिखित तरीके से, है:ggplot2 और gridExtra: पूरी तरह से facet_grid में पट्टी को दूर - बस अदृश्य नहीं

library(ggplot2) 
library(gridExtra) 
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() 
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() 
p2 <- p2 + facet_grid(cyl ~ .) 
grid.arrange(p1, p2, ncol=1) 

इसके लिए मैं की एक्स कुल्हाड़ियों की जरूरत है ऊपर और नीचे ग्राफ को लाइन करने के लिए, हालांकि बाईं ओर पट्टी की वजह से, पहना हुआ ग्राफ शीर्ष ग्राफ की तुलना में संकुचित है।

theme(strip.text.y = element_blank()) 
theme(strip.background = element_blank()) 

हालांकि इस अंतरिक्ष कि पट्टी तक ले जाता है से छुटकारा पाने के नहीं है: मैं पट्टी अदृश्य का उपयोग कर बना सकते हैं। तो मुझे या तो पूरी तरह से पट्टी से छुटकारा पाने के लिए एक रास्ता चाहिए, या मेरे पहलू ग्राफ को अलग-अलग ग्राफ में विभाजित करने का एक तरीका है, फिर भी किसी भी तरह से उन दोनों में एक ही वाई-अक्ष लेबल साझा करना। मेरे ग्राफ में मेरे पास दो पहलू पैनल हैं जो बहुत लंबा नहीं हैं, और उनके लिए पर्याप्त जगह नहीं है, प्रत्येक के पास सभ्य आकार के वाई-अक्ष हैं।

कोई सुझाव?

+0

मेरे वैकल्पिक हल (जाली है, जहां मैं और अधिक धाराप्रवाह हूँ में) "सरल" साजिश करने के लिए पट्टी को जोड़ने के लिए है। –

उत्तर

8

मेरे समाधान पट्टी की चौड़ाई को खोजने के लिए और फिर शून्य होने के लिए दोनों भूखंडों के हाशिये सेट है, लेकिन पट्टी के बिना एक छोटा थोड़ा छोटा (पट्टी की चौड़ाई) होने के लिए तो वे दिखाई होगा एक ही आकार के लिए। परीक्षण और त्रुटि से ऐसा लगता है कि पट्टी लगभग 0.5 लाइन चौड़ी है (लेकिन मुझे लगता है कि आप इसे प्रोग्रामेटिक रूप से समझ सकते हैं)। जैसे में 1 जोड़ अपनी इच्छानुसार

# Add a line of width 0.5 on the left but set all other margins to zero 
p1 <- p1 + theme(plot.margin = unit(c(0,0.5,0,0) , units = "lines")) 
# Set all margins to zero, the strip will take up a phantom amount of invisible space 
p2 <- p2 + theme(strip.text.y = element_blank() , 
    strip.background = element_blank(), 
    plot.margin = unit(c(0,0,0,0) , units = "lines")) 

grid.arrange(p1, p2, ncol=1) 

जाहिर है आप मार्जिन समायोजित कर सकते हैं (: इसलिए सिर्फ पट्टी पाठ 0.5 लाइनों अदृश्य पट्टी के साथ एक से अधिक है साजिश में यकीन है कि सही साजिश मार्जिन बनाने बिना प्रत्येक साजिश के शीर्ष पर एक पंक्ति की सीमा प्राप्त करने के लिए प्रत्येक संख्यात्मक वेक्टर में plot.margin में पहली स्थिति), जब तक आप दूसरी साजिश की दाएं सीमा में 0.5 लाइनों को अधिक मार्जिन रखते हैं, वे वही देखेंगे।

enter image description here

+0

यह सही है, धन्यवाद! –

+0

@ क्लेयर आर्मस्ट्रांग आपका स्वागत है! :-) –

1

यहाँ एक और समाधान viewport और grid.layout का उपयोग कर। मैं 2 differents लेआउट के साथ 2 व्यूपोर्ट बनाता है। फिर मैं तर्क vp का उपयोग कर ggplot2 भूखंड रखता हूं।

library(grid) 
pushViewport(plotViewport(c(1,1,1,1),layout = grid.layout(2, 1))) 
print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1)) 
pushViewport(viewport(layout.pos.row=1, 
    layout = grid.layout(1, 2,widths = unit(c(1,1),c("null",'lines'))))) 
print(p1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1)) 
upViewport(2)    

enter image description here

1

आप इसे इस तरह भी करते हैं और पट्टी खिताब रखने के लिए, जो प्रासंगिक जानकारी होगा सकता है: gtable पैकेज से फ़ंक्शन का उपयोग

library(ggplot2) 
library(gridExtra) 
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + 
     xlab(NULL) 
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + 
     facet_wrap(~ cyl, ncol = 1) 
grid.arrange(p1, p2, ncol=1) 
1

एक अन्य समाधान। यह भूखंडों को संरेखित करता है लेकिन स्ट्रिप टेक्स्ट रखता है। p2 के स्ट्रिप टेक्स्ट की चौड़ाई के बराबर p1 के दाएं कॉलम डालने के लिए यह gtable फ़ंक्शन का उपयोग करता है।

library(ggplot2) 
library(gridExtra) 
library(gtable) 

p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() 
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() 
p2 <- p2 + facet_grid(cyl ~ .) 

g1 = ggplotGrob(p1) 
# gtable_show_layout(g1) # View the layout 
# g1$widths    # Get the widths of g1 

g2 = ggplotGrob(p2) 
# gtable_show_layout(g2) # View the layout 
# g2$widths    # Check the widths of g2 

# Add new column to the right of g1 equal in width the strip width of g2. 
# In g2, strip width is the 5th element the vector g2$widths 
g1 <- gtable_add_cols(g1, g2$widths[5]) 
grid.arrange(g1, g2, ncol=1) 

enter image description here

## But note that if the y-axis titles and/or labels take up different widths, 
# the two plots are not aligned 
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + 
    theme(axis.title.y = element_text(angle = 0, size = 30)) 
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() 
p2 <- p2 + facet_grid(cyl ~ .) 

g1 = ggplotGrob(p1) 
g2 = ggplotGrob(p2) 

g1 <- gtable_add_cols(g1, g2$widths[5]) # New column added to the right 
grid.arrange(g1, g2, ncol=1)    # Plots are not aligned 

enter image description here

# Need to set widths to the maximums in the two plots, 
# i.e., set g2 widths to be the same as g1 widths 
g2$widths <- g1$widths 
grid.arrange(g1, g2, ncol=1)   # Plots are aligned 

enter image description here

संपादित करें: या के रूप में बैप्टिस्ट ने सुझाव दिया, का उपयोग gtable के rbind() समारोह:

g1 = ggplotGrob(p1) 
g2 = ggplotGrob(p2) 

g1 <- gtable_add_cols(g1, g2$widths[5], 4) # New column added to the right 

library(grid) 
grid.draw(rbind(g1, g2, size = "first")) 
+0

'grid.arrange()' के बजाय, मैं 'grid.draw (rbind (g1, g2)) की सिफारिश करता हूं। लेकिन आपको [gtable का dev संस्करण] (https://github.com/baptiste/gtable) (और अब के लिए आर-डेवेल) की आवश्यकता है, अन्यथा rbind चौड़ाई की तुलना करने में विफल रहता है। – baptiste

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