r - mexico - Mapa del mundo con ggmap
r maps mexico (3)
Hace poco recibí el mismo error y se redujo a que a ggmap no le gustaban las latitudes fuera de $ / pm $ 80 °.
Sin embargo, tuve que descargar mi imagen por separado, ya que era demasiado grande para descargarla (con OSM); este no es tu problema, pero lo grabo para futuros lectores.
Así es como lo resolví:
- descarga separada de una imagen proyectada de Mercator a través de BigMap
- La latitud necesitaba algo de cuidado: obtuve los mismos errores que muestra con límites de latitud fuera de $ / pm $ 80 ° cuando esperaba que todo estuviera bien hasta que cubra los 85 ° OSM), pero no los rastreé ya que de todos modos me pongo No necesito las latitudes muy altas.
- El centro de 0 ° / 0 ° era bueno para mi propósito (estoy en Europa :-)), pero ciertamente puedes cortar la imagen donde sea que sea bueno para ti y envolverla tú mismo por
cbind
. Solo asegúrate de saber la longitud de tu corte. - luego establece el cuadro delimitador de tu imagen
- y asigna las clases apropiadas
Esto es lo que hago:
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)))
resultado:
Editar: jugué un poco con tu mapa de google, pero no obtuve las latitudes correctas. :-(
Estoy usando ggmap y deseo tener un mapa del mundo centrado en Australia al que pueda trazar fácilmente puntos geocodificados. ggmap parece ser mucho más fácil de usar en comparación con algunos de los otros paquetes de mapeo. Sin embargo, cuando traigo un mapa usando el código a continuación, cometo errores.
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
De la ayuda get_map: "zoom: zoom de mapa, un entero de 0 (mundo entero) a 21 (edificio), valor predeterminado 10 (ciudad). Openstreetmaps limita un zoom de 18, y el límite en los mapas de estambre depende del tipo de mapa. ''auto'' determina automáticamente el zoom para las especificaciones del cuadro delimitador, y se predetermina a 10 con las especificaciones de centro / zoom. "
Cambiar el zoom a uno no es un error para get_map, pero sí para trazar ese mapa
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
Parece que la longitud no está siendo arrastrada. Finalmente, con un zoom de 2 funciona pero no trae un mapa del mundo entero
Entonces, mi pregunta es ¿cómo puedo usar get_map para obtener un mapa mundial?
Información de la sesión:
sessionInfo () R versión 2.15.0 (2012-03-30) Plataforma: 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
Mira el coord_map incorporado de ggplot. Esto puede crear mapas sin requerir un conjunto de fichas de terceros. Es ideal para mapas simples y puede usar toda la belleza que es ggplot.
EDITAR : actualizado a ggplot2 v 0.9.3
Intenté algo similar recientemente pero con poco éxito. Sin embargo, hay varias maneras de centrar un mapa del mundo desde el paquete del map
: mira here , here y here . Usando el código de este último, aquí hay un ejemplo que centra el mapa mundial en la longitud 160, traza las ubicaciones de los espejos CRAN (coordenadas obtenidas usando la función de geocode()
del paquete ggmap) en el mapa mundial trazado usando ggplot2, y colores Nueva Zelanda (usando geom_polygon
). Al centrar el mapa en la longitud 160, se debe mantener toda África a la izquierda del mapa y la mayor parte de Groenlandia a la derecha del mapa.
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")