solomon sobre resumen michael kotler hawkins gratis edicion consumidor comportamiento articulos r maps

sobre - comportamiento del consumidor solomon resumen



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

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

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

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 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 marco de datos ( 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 ° causan problemas.

Supongo que necesito transformar los datos de polígonos 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 °). Lo siguiente obtiene los puntos y las líneas costeras correctos en el mapa, pero el problema de cruce por 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 recalcularse y usarse nuevamente en la función map() . Me gustaría crear una lista con polígonos individuales, verificar cuáles tienen valores de longitud muy diferentes y reorganizarlos. 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

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

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 de centro positivos. Se adapta fácilmente para permitir valores centrales en ambas direcciones, pero ya no me molesté porque es trivial.


Un poco tarde, pero también puede crear un mapa modificado 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.

''resolution = 0'' ayuda a obtener bordes más limpios.

Puede cambiar fácilmente la longitud del centro cambiando el valor ''180'' en la descripción de la proyección.