2013-07-04 5 views
10

मैं this method का उपयोग करके 4 ggplot choropleth मानचित्रों के बाएं और दाएं किनारों को संरेखित करने का प्रयास कर रहा हूं। हालांकि मैं ऐसा करने में असमर्थ हूं।ggplot choropleth के किनारों को संरेखित करें (किंवदंती शीर्षक भिन्न होता है)

मूल साजिश: भूखंड किनारों संरेखित करने के लिए

library(ggplot2); library(gridExtra) 
crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests) 
states_map <- map_data("state") 
plot1 <- ggplot(crimes, aes(map_id = state)) + 
    geom_map(aes(fill = Murder), map = states_map) + 
    expand_limits(x = states_map$long, y = states_map$lat) + 
    scale_fill_gradient(low="white", high="darkgreen", name="Really Long Name 1") 


plot2 <- plot1 + scale_fill_gradient(name="Really Long Name 2 and then some") 
plot3 <- plot1 + scale_fill_gradient(name="Short 3") 
plot4 <- plot1 + scale_fill_gradient(name="Really Long Name 4") 

grid.arrange(plot1, plot3, plot2, plot4, ncol = 2) 

प्रयास (एक ही परिणाम):

p1 <- ggplotGrob(plot1) 
p2 <- ggplotGrob(plot2) 
p3 <- ggplotGrob(plot3) 
p4 <- ggplotGrob(plot4) 

maxWidth <- grid::unit.pmax(p1$widths[2:3], p2$widths[2:3], p3$widths[2:3], p4$widths[2:3]) 
p1$widths[2:3] <- as.list(maxWidth) 
p2$widths[2:3] <- as.list(maxWidth) 
p3$widths[2:3] <- as.list(maxWidth) 
p4$widths[2:3] <- as.list(maxWidth) 

grid.arrange(p1, p3, p2, p4, ncol = 2) 

enter image description here

पुनश्च: मान लें मैं ग्रिड का उपयोग करने की व्यवस्था की जरूरत है और किंवदंतियों वास्तव में एक ही पैमाने नहीं हैं इसलिए facet_grid बाहर आदि

+1

यदि यह केवल कथा शीर्षक कि इस मुद्दे है, तो आप पर विचार ऊपर या नीचे में क्षैतिज रखकर ? अर्थात। 'प्लॉट 1 + थीम (legend.position =' bottom ', legend.direction =' क्षैतिज ') ' – MrGumble

+0

जैसा कि आपने पोस्ट किए गए लिंक के लिए टिप्पणियों में सुझाव दिया है, आप शायद' चौड़ाई [2: 5]' का उपयोग करना चाहते हैं इकाइयों की तुलना में किंवदंती। ध्यान दें कि इसके परिणामस्वरूप @ कोहस्के के पहले उत्तर में केंद्रित एक ही किंवदंती होगी, क्योंकि गाइड ग्रोब आवंटित व्यूपोर्ट में स्वयं केंद्रित है। – baptiste

+0

मैंने 'चौड़ाई [2: 5]' की कोशिश की और इसके परिणामस्वरूप बहुत ही अजीब प्लेसमेंट हुए। –

उत्तर

9

है यहाँ एक उदाहरण है:

library(gtable) 
grid.draw(cbind(rbind(p1, p2, size="last"), rbind(p3, p4, size="last"), size = "first")) 

enter image description here


अपडेट किया गया

यह एक बुरा हैक तो मैं उपयोग करने के लिए अनुशंसा नहीं करते है। शायद यह भविष्य में काम नहीं करेगा।

gt <- cbind(rbind(p1, p2, size="last"), rbind(p3, p4, size="last"), size = "first") 
for (i in which(gt$layout$name == "guide-box")) { 
    gt$grobs[[i]] <- gt$grobs[[i]]$grobs[[1]] 
} 
grid.draw(gt) 

enter image description here

+2

+1 अच्छा समाधान। मुझे आश्चर्य है कि किंवदंतियों को भी संरेखित करना संभव है, जैसे भूखंडों के दाईं ओर केवल स्थान बढ़ता है। –

+2

@SvenHohenstein अद्यतन देखें लेकिन मैं उपयोग करने की अनुशंसा नहीं करता। – kohske

+0

'gt' कहां से आया था? –

1

cowplot पैकेज का उपयोग करना:

library(cowplot) 
plot_grid(plot1, plot3, plot2, plot4, ncol = 2, align = "v") 

enter image description here

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