Corrección de los datos de la biblioteca de mapas para la visualización centrada en el Pacífico (0 ° -360 ° de longitud)

Estoy trazando algunos puntos en un mapa del mundo usando el paquete R maps , algo así como:

Mapa del mundo, -180 ° a 180 ° de longitud

El comando para dibujar el mapa base es:

 map("world", fill=TRUE, col="white", bg="gray", ylim=c(-60, 90), mar=c(0,0,0,0)) 

Pero necesito mostrar el mapa centrado en el Pacífico. Uso el map("world2", etc. para usar el mapa base centrado en el Pacífico del paquete de mapas, y convierto las coordenadas de los puntos de datos en mi dataframe ( df ) con:

 df$longitude[df$longitude < 0] = df$longitude[df$longitude < 0] + 360 

Esto funciona si no uso la opción de fill , pero con fill los polígonos que cruzan 0 ° causa problemas.

Mapa del mundo, longitud de 0 ° a 360 °

Creo que necesito transformar los datos del polígono de la biblioteca de maps alguna manera para resolver esto, pero no tengo idea de cómo llegar a esto.

Mi solución ideal sería dibujar un mapa con un límite izquierdo a -20 ° y un límite derecho a -30 ° (es decir, 330 °). A continuación, se muestran los puntos y costas correctos en el mapa, pero el problema de cruce cero es el mismo

 df$longitude[df$longitude < -20] = df$longitude[d$longitude < -20] + 360 map("world", fill=TRUE, col="white", bg="gray", mar=c(0,0,0,0), ylim=c(-60, 90), xlim=c(-20, 330)) map("world2", add=TRUE, col="white", bg="gray", fill=TRUE, xlim=c(180, 330)) 

Cualquier ayuda sería muy apreciada.

Podría usar el hecho de que internamente, un objeto de map devuelto por la función map() puede ser recalculado y utilizado nuevamente en la función map() . Crearía una lista con polígonos individuales, verificaría cuáles tienen valores de longitud muy diferentes y reorganizaría esos. Di un ejemplo de este enfoque en la función a continuación *, que permite algo como:

 plot.map("world", center=180, col="white",bg="gray", fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0)) 

Llegar

Centro de mapas corregido 180

Si fuera tú, cambiaría todo un poco más, como en:

 plot.map("world", center=200, col="white",bg="gray", fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0)) 

Centro de mapas corregido 200

La función :

 plot.map<- function(database,center,...){ Obj <- map(database,...,plot=F) coord <- cbind(Obj[[1]],Obj[[2]]) # split up the coordinates id <- rle(!is.na(coord[,1])) id <- matrix(c(1,cumsum(id$lengths)),ncol=2,byrow=T) polygons <- apply(id,1,function(i){coord[i[1]:i[2],]}) # split up polygons that differ too much polygons <- lapply(polygons,function(x){ x[,1] <- x[,1] + center x[,1] <- ifelse(x[,1]>180,x[,1]-360,x[,1]) if(sum(diff(x[,1])>300,na.rm=T) >0){ id <- x[,1] < 0 x <- rbind(x[id,],c(NA,NA),x[!id,]) } x }) # reconstruct the object polygons <- do.call(rbind,polygons) Obj[[1]] <- polygons[,1] Obj[[2]] <- polygons[,2] map(Obj,...) } 

* Tenga en cuenta que esta función solo toma valores centrales positivos. Se adapta fácilmente para permitir valores centrales en ambas direcciones, pero ya no me molesté, ya que es trivial.

Un poco tarde, pero también puedes crear un mapa desplazado usando una proyección (requiere el paquete mapproj):

  map("world", projection="rectangular", parameter=0, orientation=c(90,0,180), wrap=TRUE, fill=T, resolution=0,col=0) 

Esto cambiará en 180 grados. Pero la diferencia con ‘world2’ es que la coordenada de longitud será diferente ([-pi, pi]). Todas las proyecciones de este paquete ponen 0 en el centro. Y en ese caso, la opción ‘wrap’ detecta el salto correctamente.

‘resolución = 0’ ayuda a obtener bordes más limpios.

Puede cambiar fácilmente la longitud central al cambiar el valor ‘180’ en la descripción de la proyección.

instala la última versión de mapas (3.2.0).

hacer esto:

 d$lon2 <- ifelse(d$lon < -25, d$lon + 360, d$lon) # where d is your df mapWorld <- map_data('world', wrap=c(-25,335), ylim=c(-55,75)) ggplot() + geom_polygon(data = mapWorld, aes(x=long, y = lat, group = group)) + geom_point(data = d, aes(x = lon2, y = lat))