with mexico ggplot beautiful r map ggplot2

mexico - Mapa del mundo-mapa de mitades de países a diferentes colores



r maps mexico (1)

Esta es una solución sin ggplot que se basa en la función de plot lugar. También requiere el paquete rgeos además del código en el OP:

EDITAR Ahora con un 10% menos de dolor visual

EDIT 2 Ahora con centroides para las mitades este y oeste

library(rgeos) library(RColorBrewer) # Get centroids of countries theCents <- coordinates(world.map) # extract the polygons objects pl <- slot(world.map, "polygons") # Create square polygons that cover the east (left) half of each country''s bbox lpolys <- lapply(seq_along(pl), function(x) { lbox <- bbox(pl[[x]]) lbox[1, 2] <- theCents[x, 1] Polygon(expand.grid(lbox[1,], lbox[2,])[c(1,3,4,2,1),]) }) # Slightly different data handling wmRN <- row.names(world.map) n <- nrow(world.map@data) world.map@data[, c("growth", "category")] <- list(growth = 4*runif(n), category = factor(sample(1:5, n, replace=TRUE))) # Determine the intersection of each country with the respective "left polygon" lPolys <- lapply(seq_along(lpolys), function(x) { curLPol <- SpatialPolygons(list(Polygons(lpolys[x], wmRN[x])), proj4string=CRS(proj4string(world.map))) curPl <- SpatialPolygons(pl[x], proj4string=CRS(proj4string(world.map))) theInt <- gIntersection(curLPol, curPl, id = wmRN[x]) theInt }) # Create a SpatialPolygonDataFrame of the intersections lSPDF <- SpatialPolygonsDataFrame(SpatialPolygons(unlist(lapply(lPolys, slot, "polygons")), proj4string = CRS(proj4string(world.map))), world.map@data) ########## ## EDIT ## ########## # Create a slightly less harsh color set s_growth <- scale(world.map@data$growth, center = min(world.map@data$growth), scale = max(world.map@data$growth)) growthRGB <- colorRamp(c("red", "blue"))(s_growth) growthCols <- apply(growthRGB, 1, function(x) rgb(x[1], x[2], x[3], maxColorValue = 255)) catCols <- brewer.pal(nlevels(lSPDF@data$category), "Pastel2") # and plot plot(world.map, col = growthCols, bg = "grey90") plot(lSPDF, col = catCols[lSPDF@data$category], add = TRUE)

Tal vez alguien pueda encontrar una buena solución usando ggplot2 . Sin embargo, según esta respuesta a una pregunta sobre múltiples escalas de relleno para un solo gráfico ("No puedes"), una solución ggplot2 parece poco probable sin facetar (lo que podría ser un buen enfoque, como se sugiere en los comentarios anteriores).

EDITAR re: mapear los centroides de las mitades a algo: Los centroides para las mitades del este ("izquierda") se pueden obtener de

coordinates(lSPDF)

Aquellos para las mitades del oeste ("derecha") se pueden obtener creando un objeto rSPDF de una manera similar:

# Create square polygons that cover west (right) half of each country''s bbox rpolys <- lapply(seq_along(pl), function(x) { rbox <- bbox(pl[[x]]) rbox[1, 1] <- theCents[x, 1] Polygon(expand.grid(rbox[1,], rbox[2,])[c(1,3,4,2,1),]) }) # Determine the intersection of each country with the respective "right polygon" rPolys <- lapply(seq_along(rpolys), function(x) { curRPol <- SpatialPolygons(list(Polygons(rpolys[x], wmRN[x])), proj4string=CRS(proj4string(world.map))) curPl <- SpatialPolygons(pl[x], proj4string=CRS(proj4string(world.map))) theInt <- gIntersection(curRPol, curPl, id = wmRN[x]) theInt }) # Create a SpatialPolygonDataFrame of the western (right) intersections rSPDF <- SpatialPolygonsDataFrame(SpatialPolygons(unlist(lapply(rPolys, slot, "polygons")), proj4string = CRS(proj4string(world.map))), world.map@data)

Luego, la información podría trazarse en el mapa de acuerdo con los centroides de lSPDF o rSPDF :

points(coordinates(rSPDF), col = factor(rSPDF@data$REGION)) # or text(coordinates(lSPDF), labels = lSPDF@data$FIPS, cex = .7)

Estoy usando el ejemplo aquí para discusión: ggplot map with l

library(rgdal) library(ggplot2) library(maptools) # Data from http://thematicmapping.org/downloads/world_borders.php. # Direct link: http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip # Unpack and put the files in a dir ''data'' gpclibPermit() world.map <- readOGR(dsn="data", layer="TM_WORLD_BORDERS_SIMPL-0.3") world.ggmap <- fortify(world.map, region = "NAME") n <- length(unique(world.ggmap$id)) df <- data.frame(id = unique(world.ggmap$id), growth = 4*runif(n), category = factor(sample(1:5, n, replace=T))) ## noise df[c(sample(1:100,40)),c("growth", "category")] <- NA ggplot(df, aes(map_id = id)) + geom_map(aes(fill = growth, color = category), map =world.ggmap) + expand_limits(x = world.ggmap$long, y = world.ggmap$lat) + scale_fill_gradient(low = "red", high = "blue", guide = "colorbar")

Da los siguientes resultados:

Me gustaría asignar una variable a la "mitad" izquierda de un país y una variable diferente a la "mitad" derecha del país. Pongo "la mitad" entre comillas porque no está claramente definido (o al menos no lo estoy definiendo claramente). La respuesta de Ian Fellows podría ayudar (lo que proporciona una manera fácil de obtener el centroide). Estoy esperando algo para poder hacer aes(left_half_color = growth, right_half_color = category) en el ejemplo. También me interesa la mitad superior y la mitad inferior si eso es diferente.

Si es posible, también me gustaría asignar los centroides individuales de las mitades a algo.