2012-11-17 24 views
16

में एकाधिक किंवदंतियों का औचित्य मैं आकार और रंग ("टाइप" और "ऑर्ग" को नीचे दिए गए उदाहरण में दर्शाते हुए दो किंवदंतियों के साथ एक नक्शा बनाने की कोशिश कर रहा हूं), और किंवदंतियों के इन्सेट हैं। मैं किंवदंतियों को रख सकता हूं, लेकिन मैं उन्हें उचित ठहराना चाहता हूं ताकि उनके बाएं किनारों को लाइन किया जा सके। मैं एक दूसरे के लिए उन्हें सम्मान के साथ केंद्रित के अलावा और कुछ नहीं कर सकते हैं:ggmap/ggplot2

require(ggplot2) 
require(ggmap) 
require(grid) 
require(mapproj) 

data <- data.frame(Org=rep(c("ABCDEFG","HIJKLMNOP","QRSTUVWX"),4) 
        , Type=rep(c("Y","Z"),6), Lat=runif(12,48,54.5) 
        , Long=runif(12,-133.5,-122.5)) 

osmMap <- get_map(location=c(-134,47.5,-122,55), source = 'osm') 

points <- geom_jitter(data=data, aes(Long, Lat, shape=Type 
            , colour=Org)) 

legend <- theme(legend.justification=c(0,0), legend.position=c(0,0) 
       , legend.margin=unit(0,"lines"), legend.box="vertical" 
       , legend.key.size=unit(1,"lines"), legend.text.align=0 
       , legend.title.align=0) 

ggmap(osmMap) + points + legend 

enter image description here

+1

यह एक सीधा जवाब नहीं है, लेकिन आप थोड़ा धोखा कर सकते हैं उन्हें समान रूप से आकार देने के लिए प्रारूप का उपयोग करके। अपने डेटा घोषणा के बाद 'डेटा $ प्रकार <- प्रारूप (डेटा $ प्रकार, चौड़ाई = 17)' का प्रयास करें और अपना कोड दोबारा शुरू करें। –

+0

यह एक साफ चाल है, धन्यवाद। मैं इसे सोमवार – andyteucher

उत्तर

19

यह विकल्प अब ggplot2 0.9.3.1 में उपलब्ध है, का उपयोग

ggmap(osmMap) + points + legend + theme(legend.box.just = "left") 

पुरानी, मैनुअल समाधान:

यहां एक समाधान है:

require(gtable) 
require(ggplot2) 
require(ggmap) 
require(grid) 
require(mapproj) 

# Original data 
data <- data.frame(Org=rep(c("ABCDEFG","HIJKLMNOP","QRSTUVWX"),4), 
        Type=rep(c("Y","Z"),6), Lat=runif(12,48,54.5), 
        Long=runif(12,-133.5,-122.5)) 
osmMap <- get_map(location=c(-134,47.5,-122,55), source = 'google') 
points <- geom_jitter(data=data, aes(Long, Lat, shape=Type, colour=Org)) 
legend <- theme(legend.justification=c(0,0), legend.position=c(0,0), 
       legend.margin=unit(0,"lines"), legend.box="vertical", 
       legend.key.size=unit(1,"lines"), legend.text.align=0, 
       legend.title.align=0) 

# Data transformation 
p <- ggmap(osmMap) + points + legend 
data <- ggplot_build(p) 
gtable <- ggplot_gtable(data) 

# Determining index of legends table 
lbox <- which(sapply(gtable$grobs, paste) == "gtable[guide-box]") 
# Each legend has several parts, wdth contains total widths for each legend 
wdth <- with(gtable$grobs[[lbox]], c(sum(as.vector(grobs[[1]]$widths)), 
            sum(as.vector(grobs[[2]]$widths)))) 
# Determining narrower legend 
id <- which.min(wdth) 
# Adding a new empty column of abs(diff(wdth)) mm width on the right of 
# the smaller legend box 
gtable$grobs[[lbox]]$grobs[[id]] <- gtable_add_cols(
             gtable$grobs[[lbox]]$grobs[[id]], 
             unit(abs(diff(wdth)), "mm")) 
# Plotting 
grid.draw(gtable) 

यह Type या Org पर निर्भर नहीं है। हालांकि, यह दो से अधिक किंवदंतियों के साथ पर्याप्त नहीं होगा। इसके अलावा, यदि आप कुछ परिवर्तन करते हैं तो ग्रब्स (ग्राफ़िकल ऑब्जेक्ट्स) की सूची बदल दी जाती है, तो आपको grobs[[8]] से grobs[[i]] को बदलना पड़ सकता है, जहां i आपकी किंवदंतियों की स्थिति है, gtable$grobs देखें और TableGrob (5 x 3) "guide-box": 2 grobs देखें। enter image description here

संपादित करें: 1. स्वचालित रूप से जो Grob है किंवदंतियों मेज, जिसका अर्थ है कोई साजिश के अन्य भागों संशोधित करने के बाद कुछ भी बदलने की जरूरत का पता लगाने। 2. चौड़ाई मतभेद की बदली गई गणना, अब कोड जब किसी भी दो किंवदंतियों होने, साथ ही अधिक जटिल मामलों में अर्थात् काम करना चाहिए, उदाहरण के लिए:

enter image description here

+0

पर एक शॉट दूंगा, धन्यवाद @ जुलिएस - यह अच्छी तरह से काम करता है, और मुझे जीटेबल का उपयोग करने में कुछ अंतर्दृष्टि दी गई, जिसे मैंने वास्तव में पहले नहीं खोजा था। – andyteucher

+0

मैं इस उदाहरण को पुन: उत्पन्न करने में असमर्थ हूं। मुझे 'osmMap' कहां से मिलता है? मुझे लगता है कि यह कुछ डेटा सेट है। –

+1

@ फेहेम मिथा, हां, यह सवाल से डेटा है। मैंने इसे अपने उत्तर में जोड़ा है और 'स्रोत =' osm'' को 'स्रोत =' google'' में बदल दिया है क्योंकि पूर्व कम से कम अभी तक काम नहीं करता है। – Julius

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

  • कोई संबंधित समस्या नहीं^_^