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.