ggmap

2012-06-26 32 views
23

के साथ विश्व मानचित्र ggmap का उपयोग कर रहा हूं और ऑस्ट्रेलिया पर केंद्रित दुनिया का नक्शा रखना चाहता हूं जिसके लिए मैं भूगर्भीय बिंदुओं को आसानी से प्लॉट कर सकता हूं। ggmap कुछ अन्य मैपिंग पैकेजों की तुलना में उपयोग करना बहुत आसान लगता है। फिर भी जब मैं नीचे दिए गए कोड का उपयोग करके मानचित्र को लाता हूं तो त्रुटियां।ggmap

gc <- geocode('australia') 
center <- as.numeric(gc) 
> map <- get_map(location = center, source="google", maptype="terrain", zoom=0) 
Error: zoom must be a whole number between 1 and 21 
get_map मदद से

: "ज़ूम:। मानचित्र ज़ूम, 21 (निर्माण) के लिए 0 (पूरी दुनिया) से एक पूर्णांक डिफ़ॉल्ट मान 10 (शहर) openstreetmaps 18 के एक जूम को सीमित करता है, और स्टैमेन मैप्स पर सीमा मैप्टाइप पर निर्भर करती है। 'ऑटो' बॉक्सिंग विनिर्देशों को बाध्य करने के लिए ज़ूम को स्वचालित रूप से निर्धारित करता है, और केंद्र/ज़ूम विनिर्देशों के साथ 10 तक डिफॉल्ट किया जाता है। "

एक करने के लिए ज़ूम बदलने get_map के लिए त्रुटि नहीं है लेकिन यह है कि नक्शा

map <- get_map(location = center, source="google", maptype="terrain", zoom=1) 
ggmap(map) 

Warning messages: 
1: In min(x) : no non-missing arguments to min; returning Inf 
2: In max(x) : no non-missing arguments to max; returning -Inf 
3: In min(x) : no non-missing arguments to min; returning Inf 
4: In max(x) : no non-missing arguments to max; returning -Inf 

यह देशांतर के माध्यम से खींच लिया नहीं किया जा रहा है की तरह लग रहा की साजिश रचने के लिए करता है। अंत में 2 ज़ूम के साथ यह काम करता है लेकिन पूरी दुनिया के मानचित्र को नहीं लाता है

तो, मेरा सवाल यह है कि मैं विश्व मानचित्र प्राप्त करने के लिए get_map का उपयोग कैसे कर सकता हूं?

सत्र जानकारी:

sessionInfo() आर संस्करण 2.15.0 (2012-03-30) प्लेटफार्म: i386-पीसी-mingw32/i386 (32-बिट)

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 
[2] LC_CTYPE=English_United Kingdom.1252 
[3] LC_MONETARY=English_United Kingdom.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] mapproj_1.1-8.3 maps_2.2-6  rgdal_0.7-12 sp_0.9-99  
[5] ggmap_2.1  ggplot2_0.9.1 

loaded via a namespace (and not attached): 
[1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2  grid_2.15.0  
[5] labeling_0.1  lattice_0.20-6  MASS_7.3-17  memoise_0.1  
[9] munsell_0.3  plyr_1.7.1   png_0.1-4   proto_0.3-9.2  
[13] RColorBrewer_1.0-5 reshape2_1.2.1  RgoogleMaps_1.2.0 rjson_0.2.8  
[17] scales_0.2.1  stringr_0.6  tools_2.15.0 
+0

आपने अभी तक कोई जवाब स्वीकार नहीं किया है, तो क्या आपको एक अलग समाधान मिला है? – maj

+0

@maj मुझे दुनिया के नक्शे को खींचने के लिए ggmap का उपयोग करके कोई समाधान नहीं मिला है। नीचे दिए गए उत्तर बहुत अच्छे हैं लेकिन उन्हें कहीं और से एक विश्व मानचित्र खींचने की आवश्यकता है और उसके बाद साजिश कर रहे हैं। – user1414259

उत्तर

13

संपादित: वी ggplot2 के लिए 0.9.3

अपडेट किया मैं कुछ इसी तरह recenty कोशिश की, लेकिन साथ छोटी सफलता हालांकि, map पैकेज से विश्व मानचित्र को केन्द्रित करने के कई तरीके हैं: here, here, और here देखें। उत्तरार्द्ध से कोड का उपयोग करते हुए, यहां एक उदाहरण है जो देशांतर मानचित्र को रेखांश 160 पर केंद्रित करता है, जीआरपीएपी पैकेज से geocode() फ़ंक्शन का उपयोग करके प्राप्त किए गए निर्देशांक) ggplot2 का उपयोग करके प्लॉट किए गए विश्व मानचित्र पर, और न्यूज़ीलैंड रंग (geom_polygon का उपयोग करके) । देशांतर के नक्शे पर नक्शा केंद्रित करने से मानचित्र के बाईं ओर सभी अफ्रीका रहते हैं, और मानचित्र के दाईं ओर ग्रीनलैंड के अधिकांश भाग रहते हैं।

library(maps) 
library(plyr) 
library(ggplot2) 
library(sp) 
library(ggmap) 

# Get some points to plot - CRAN Mirrors 
Mirrors = getCRANmirrors(all = FALSE, local.only = FALSE) 

Mirrors$Place = paste(Mirrors$City, ", ", Mirrors$Country, sep = "") # Be patient 
tmp = geocode(Mirrors$Place) 
Mirrors = cbind(Mirrors, tmp) 

################################################################################################### 
# Recentre worldmap (and Mirrors coordinates) on longitude 160 
### Code by Claudia Engel March 19, 2012, www.stanford.edu/~cengel/blog 

### Recenter #### 
center <- 160 # positive values only 

# shift coordinates to recenter CRAN Mirrors 
Mirrors$long.recenter <- ifelse(Mirrors$lon < center - 180 , Mirrors$lon + 360, Mirrors$lon) 

# shift coordinates to recenter worldmap 
worldmap <- map_data ("world") 
worldmap$long.recenter <- ifelse(worldmap$long < center - 180 , worldmap$long + 360, worldmap$long) 

### Function to regroup split lines and polygons 
# Takes dataframe, column with long and unique group variable, returns df with added column named group.regroup 
RegroupElements <- function(df, longcol, idcol){ 
    g <- rep(1, length(df[,longcol])) 
    if (diff(range(df[,longcol])) > 300) { # check if longitude within group differs more than 300 deg, ie if element was split 
    d <- df[,longcol] > mean(range(df[,longcol])) # we use the mean to help us separate the extreme values 
    g[!d] <- 1 # some marker for parts that stay in place (we cheat here a little, as we do not take into account concave polygons) 
    g[d] <- 2 # parts that are moved 
    } 
    g <- paste(df[, idcol], g, sep=".") # attach to id to create unique group variable for the dataset 
    df$group.regroup <- g 
    df 
} 

### Function to close regrouped polygons 
# Takes dataframe, checks if 1st and last longitude value are the same, if not, inserts first as last and reassigns order variable 
ClosePolygons <- function(df, longcol, ordercol){ 
    if (df[1,longcol] != df[nrow(df),longcol]) { 
    tmp <- df[1,] 
    df <- rbind(df,tmp) 
    } 
    o <- c(1: nrow(df)) # rassign the order variable 
    df[,ordercol] <- o 
    df 
} 

# now regroup 
worldmap.rg <- ddply(worldmap, .(group), RegroupElements, "long.recenter", "group") 

# close polys 
worldmap.cp <- ddply(worldmap.rg, .(group.regroup), ClosePolygons, "long.recenter", "order") # use the new grouping var 
############################################################################# 

# Plot worldmap using data from worldmap.cp 
windows(9.2, 4) 
worldmap = ggplot(aes(x = long.recenter, y = lat), data = worldmap.cp) + 
    geom_polygon(aes(group = group.regroup), fill="#f9f9f9", colour = "grey65") + 
    scale_y_continuous(limits = c(-60, 85)) + 
    coord_equal() + theme_bw() + 
    theme(legend.position = "none", 
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(), 
    #axis.text.x = element_blank(), 
    axis.text.y = element_blank(), 
    axis.ticks = element_blank(), 
    panel.border = element_rect(colour = "black")) 

# Plot the CRAN Mirrors 
worldmap = worldmap + geom_point(data = Mirrors, aes(long.recenter, lat), 
    colour = "red", pch = 19, size = 3, alpha = .4) 

# Colour New Zealand 
# Take care of variable names in worldmap.cp 
head(worldmap.cp) 
worldmap + geom_polygon(data = subset(worldmap.cp, region == "New Zealand", select = c(long.recenter, lat, group.regroup)), 
      aes(x = long.recenter, y = lat, group = group.regroup), fill = "blue") 

enter image description here

+0

इसके लिए धन्यवाद। मुझे आपके द्वारा बताए गए अन्य तरीकों से अवगत था, लेकिन मुझे उम्मीद थी कि ggmap का उपयोग करने का एक तरीका था क्योंकि तब मैं पॉइंट प्वाइंट कर सकता हूं आसानी से! – user1414259

9

मैं हाल ही में एक ही त्रुटि मिली और यह पसंद नहीं अक्षांश बाहर $ \ बजे $ 80 डिग्री ggmap करने के लिए नीचे उबला हुआ।

हालांकि, मुझे अपनी छवि को अलग से डाउनलोड करना पड़ा क्योंकि यह डाउनलोड के लिए बहुत बड़ा था (ओएसएम के साथ); यह आपकी समस्या नहीं है, लेकिन मैं इसे भविष्य के पाठकों के लिए रिकॉर्ड करता हूं।

यहाँ कैसे मैं इसे हल है:

    एक मर्केटर की
  • अलग डाउनलोड BigMap
  • अक्षांश कुछ देखभाल की जरूरत के माध्यम से प्रक्षेपित छवि: मैं एक ही त्रुटियों आप अक्षांश सीमा के साथ दिखाने मिला बाहर $ \ बजे $ 80 ° जब मुझे उम्मीद थी कि 85 डिग्री ओएसएम कवर तक सब कुछ ठीक होना चाहिए), लेकिन मैंने उन्हें ट्रैक नहीं किया क्योंकि मुझे किसी भी तरह के उच्च अक्षांश की आवश्यकता नहीं है।
  • 0 डिग्री/0 डिग्री केंद्र मेरे उद्देश्य के लिए अच्छा था (मैं यूरोप में हूं :-)), लेकिन आप निश्चित रूप से छवि whereever काट सकते हैं यह आपके लिए अच्छा है और इसे cbind द्वारा स्वयं को लपेटें। बस सुनिश्चित करें कि आप अपने कट का देशांतर जानते हैं।
  • तो अपनी छवि
  • की बाउंडिंग बॉक्स सेट और उचित वर्गों आवंटित

यहाँ मैं क्या करना है:

require ("ggmap") 
library ("png") 

zoom <- 2 
map <- readPNG (sprintf ("mapquest-world-%i.png", zoom)) 
map <- as.raster(apply(map, 2, rgb)) 

# cut map to what I really need 
pxymin <- LonLat2XY (-180,73,zoom+8)$Y # zoom + 8 gives pixels in the big map 
pxymax <- LonLat2XY (180,-60,zoom+8)$Y # this may or may not work with google 
             # zoom values 
map <- map [pxymin : pxymax,] 

# set bounding box 
attr(map, "bb") <- data.frame (ll.lat = XY2LonLat (0, pxymax + 1, zoom+8)$lat, 
            ll.lon = -180, 
            ur.lat = round (XY2LonLat (0, pxymin, zoom+8)$lat), 
            ur.lon = 180) 
class(map) <- c("ggmap", "raster") 

ggmap (map) + 
    geom_point (data = data.frame (lat = runif (10, min = -60 , max = 73), 
           lon = runif (10, min = -180, max = 180))) 

परिणाम:
ggplot world map

संपादित करें: मैं खेला अपने Google मानचित्र के साथ थोड़ा सा, लेकिन मुझे अक्षांश सही नहीं मिला। :-(

0

चेक बाहर ggplot की इनबिल्ट coord_map। यह टाइल्स की एक तीसरे पक्ष के सेट की आवश्यकता के बिना नक्शे बना सकते हैं। सरल नक्शे के लिए अपने महान और सुंदरता ggplot है कि का उपयोग कर सकते हैं।

http://docs.ggplot2.org/current/coord_map.html

+0

जैसा कि लिंक में उल्लिखित है, coord_map (अभिविन्यास = सी (लोन, लैट, रोटेशन)) इस पुन: केंद्रित समस्या को हल करने का अनुमान है, लेकिन ऐसा नहीं है। अभिविन्यास का डिफ़ॉल्ट सी (90,0,180) है, और इसे सी (90,160,180) में बदलना केंद्र को स्थानांतरित कर सकता है, लेकिन यह मानचित्र प्रदर्शन को भी खराब कर देता है। ऐसा कोई फिक्स नहीं लगता है। Gsplot2 में @sandy पोस्ट किया गया एकमात्र समाधान (जिसे मैं पा सकता हूं) है। – woshishui