Dies ist eine Lösung ohne ggplot
, die stattdessen auf der plot
Funktion basiert. Es erfordert auch das rgeos
Paket zusätzlich zu dem Code in der OP:
EDIT Jetzt mit 10% weniger visuellen Schmerz
EDIT 2 Jetzt mit Zentroiden für Ost und Westen Hälften
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([email protected])
[email protected][, 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))),
[email protected])
##########
## EDIT ##
##########
# Create a slightly less harsh color set
s_growth <- scale([email protected]$growth,
center = min([email protected]$growth), scale = max([email protected]$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([email protected]$category), "Pastel2")
# and plot
plot(world.map, col = growthCols, bg = "grey90")
plot(lSPDF, col = catCols[[email protected]$category], add = TRUE)
Vielleicht hat jemand kommen kann w iith eine gute Lösung mit ggplot2
. Basierend auf this answer zu einer Frage über mehrere Füllskalen für ein einzelnes Diagramm ("Sie können nicht"), scheint eine ggplot2
Lösung ohne Facettierung unwahrscheinlich (was ein guter Ansatz sein könnte, wie in den obigen Kommentaren vorgeschlagen).
EDIT re: Mapping Zentroide der Hälften zu etwas: Die Zentroide für den Osten ("links") Hälften durch
coordinates(lSPDF)
die für den Westen ("right" erhalten werden) Hälften können durch die Schaffung eines rSPDF
Objekt in ähnlicher Weise erhalten werden:
# 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))),
[email protected])
Dann wird auf der Karte werden Informationen könnten aufgetragen nach die Schwerpunkte von lSPDF
oder rSPDF
:
points(coordinates(rSPDF), col = factor([email protected]$REGION))
# or
text(coordinates(lSPDF), labels = [email protected]$FIPS, cex = .7)
Möglicherweise möchten Sie mit zwei Karten Side-by-side betrachten. Könnte viel intuitiver zu sehen und zu interpretieren sein als diese Spaltung des Landes. –
@Marcinthebox danke für den Vorschlag. –