2012-06-26 12 views
23

Ich benutze ggmap und möchte eine Weltkarte über Australien haben, auf der ich geokodierte Punkte leicht darstellen kann. ggmap scheint im Vergleich zu einigen anderen Mapping-Paketen viel einfacher zu benutzen zu sein. Aber wenn ich eine Karte durchführe, benutze den Code darunter Fehler.Weltkarte mit 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 

Vom get_map Hilfe: „zoom:. Mapzoom, eine ganze Zahl von 0 (ganzer Welt) bis 21 (Gebäude), Standardwert 10 (Stadt) OpenStreetMap begrenzt einen Zoom von 18 und Das Limit für Staubkartenkarten hängt vom Kartentyp ab. "Automatisch" bestimmt automatisch den Zoom für Begrenzungsrahmenspezifikationen und wird standardmäßig auf 10 mit Mittel-/Zoomspezifikationen festgelegt. "

Änderung der Zoom einem nicht Fehler für get_map aber tut zum Plotten, dass die Karte

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 

Es ist wie die Länge sieht nicht durchgezogen werden. Schließlich mit einem Zoom von 2 funktioniert es aber nicht durch eine Karte der ganzen Welt

Also, meine Frage ist, wie kann ich get_map verwenden, um eine Weltkarte zu bekommen?

Session info:

Session() R Version 2.15.0 (2012-03-30) Plattform: i386-pc-mingw32/i386 (32-Bit)

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

ist verwenden kann Sie haben noch keine Antwort angenommen, also haben Sie eine andere Lösung gefunden? – maj

+0

@maj Ich habe keine Lösung gefunden mit ggmap, um durch die Weltkarte zu ziehen.Die Antworten unten sind großartig, aber sie erfordern eine Weltkarte von woanders zu ziehen und dann zeichne ich drüber – user1414259

Antwort

13

EDIT: Aktualisiert v ggplot2 0.9.3

ich etwas ähnliches recenty versucht, aber mit wenig Erfolg. Es gibt jedoch eine Anzahl von Möglichkeiten, eine Weltkarte aus dem map-Paket zu zentrieren: siehe here, here und here. Unter Verwendung des Codes von letzterem ist hier ein Beispiel, das die Weltkarte auf Länge 160 zentriert, CRAN-Spiegelpositionen (Koordinaten, die unter Verwendung der -Funktion aus dem ggmap-Paket erhalten wurden) auf der mit ggplot2 geplotteten Weltkarte und Farben Neuseeland (unter Verwendung von geom_polygon) . Wenn Sie die Karte auf 160 Grad zentrieren, behalten Sie ganz Afrika auf der linken Seite der Karte und den Großteil von Grönland auf der rechten Seite der Karte.

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

Danke für das. Ich war mir der anderen Möglichkeiten bewusst, die du erwähnt hast, aber ich hatte gehofft, dass es einen Weg gab, ggmap zu benutzen, weil ich dann Punkte zeichnen kann auf leicht! – user1414259

9

Ich erhielt vor kurzem den gleichen Fehler und es kocht nicht Breiten außerhalb $ \ pm $ 80 ° bis ggmap mögen.

Allerdings musste ich mein Bild separat herunterladen, da es zu groß für einen Download war (mit OSM); Das ist nicht dein Problem, aber ich nehme es für zukünftige Leser auf.

Hier ist, wie ich es gelöst:

  • separaten Download einer Mercator Bild projiziert über BigMap
  • Die Breite eine gewisse Sorgfalt erforderlich: habe ich die gleichen Fehler, die Sie mit der geographischen Breite Grenzen zeigen außerhalb $ \ pm $ 80 ° als ich erwartet habe, dass alles in Ordnung sein soll, bis die 85 ° OSM abdeckt), aber ich habe sie nicht gefunden, da ich sowieso die sehr hohen Breiten nicht brauche.
  • 0 °/0 ° Zentrum war gut für meinen Zweck (ich bin in Europa :-)), aber Sie können sicherlich das Bild schneiden, wo es gut für Sie ist und wickeln Sie es selbst durch cbind. Stellen Sie sicher, dass Sie die Länge Ihres Schnitts kennen.
  • stellen Sie dann den Begrenzungsrahmen des Bildes
  • und weisen Sie die entsprechenden Klassen

Hier ist, was ich tue:

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))) 

Ergebnis:
ggplot world map

Edit: Ich spielte ein bisschen herum mit deiner Google Map, aber ich habe die Breitengrade nicht richtig verstanden. :-(

0

prüfen ggplot des eingebauten coord_map aus. Dies kann Karten zu erstellen, ohne einen Dritten Satz von Fliesen zu erfordern. Seine große für einfache Karten und all der Schönheit, die ggplot.

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

+0

Wie im Link erwähnt, soll coord_map (orientation = c (lon, lat, rotation)) dieses Problem der Zentrierung lösen, tut es aber nicht. Der Standardwert für die Ausrichtung ist c (90,0,180), und wenn Sie ihn in c (90,160,180) ändern, kann die Mitte verschoben werden, aber auch die Kartenanzeige wird verworfen. Es scheint auch keine Probleme zu geben. Was @sandy gepostet hat, ist die einzige Lösung (die ich finden kann) in ggplot2. – woshishui