2017-06-20 2 views
1

Ich habe einen Datensatz mit mehr als 50.000 Daten. Dieser Datensatz enthält Objekte, Längen- und Breitengrade (mit der folgenden Struktur).Colorizing ggplot Karte basierend auf der Anzahl der Bevölkerung

coord <- data.frame(object = c("a","b","c","d","e","f","h","i","j","k"), LON = c(-73.95 ,-73.97,-73.95,-73.91,-73.91,-73.93,-73.96, -73.90,-73.97,-73.94),LAT =c(40.60,40.68,40.68,40.85,40.83,40.72,40.65, 40.74, 40.69, 40.82)) 

Ich plane, verschiedenen Bezirk der Karte zu kolorieren. Ich habe den folgenden Beispielcode gefunden.

library(rgeos) 
library(maptools) 
library(geojsonio) 
library(ggplot2) 
URL <- "http://services5.arcgis.com/GfwWNkhOj9bNBqoJ/arcgis/rest/services/nycd/FeatureServer/0/query?where=1=1&outFields=*&outSR=4326&f=geojson" 
fil <- "nyc_community_districts.geojson" 
if (!file.exists(fil)) download.file(URL, fil) 
nyc_districts <- geojson_read(fil, what="sp") 
nyc_districts_map <- fortify(nyc_districts, region="BoroCD") 
mids <- cbind.data.frame(as.data.frame(gCentroid(nyc_districts, byid=TRUE)),id=nyc_districts$BoroCD) 
gg <- ggplot() 
gg <- gg + geom_map(data=nyc_districts_map, map=nyc_districts_map, 
       aes(x=long, y=lat, map_id=id), 
       color="#2b2b2b", size=0.15, fill=NA) 
gg <- gg + geom_text(data=mids, aes(x=x, y=y, label=id), size=2) 
gg <- gg + coord_map() 
gg <- gg + ggthemes::theme_map() 

Dann habe ich diesen Code für verschiedenen Bezirk Einfärben

library(viridis) 
# make up some fill data 
set.seed(1492) 
df <- data.frame(LON = c(-73.95770,-73.95445,-73.96215,-73.97739,-73.98136,-73.93974,-73.95061, -73.98609 ,-73.95724,-73.93351,-73.94931),LAT =c(40.81099,40.71415,40.71025,40.68983,40.66715,40.79821,40.66830, 40.68980, 40.71636, 40.76621, 40.80273)) 

pointsSp <- SpatialPoints(coords = df[,c("LON", "LAT")], 
         proj4string = CRS(proj4string(nyc_districts))) 
nyc_districts$pointCount <- 0 
for(i in 1:length(nyc_districts)){ 
    x <- nyc_districts[i,] 
    nyc_districts$pointCount[i] <- length(x[pointsSp,]) 
} 

choro <- data.frame([email protected]$BoroCD, 
       fill=sample(100, nrow([email protected]))) 
gg <- ggplot() 
gg <- gg + geom_map(data=nyc_districts_map, map=nyc_districts_map, 
       aes(x=long, y=lat, map_id=id), 
       color="#2b2b2b", size=0.15, fill=NA) 
gg <- gg + geom_map(data=choro, map=nyc_districts_map, 
       aes(fill=fill, map_id=district), 
       color="#2b2b2b", size=0.15) 
gg <- gg + geom_point(data=coord, aes(x=LON, y=LAT), 
        colour= "red", alpha=1,na.rm=T) 
gg <- gg + scale_fill_viridis(name="Pick ups\ndistribution") +  geom_text(data=mids, aes(x=x, y=y, label=id), size=2) 
gg <- gg + coord_map() 
gg <- gg + ggthemes::theme_map() 
gg <- gg + theme(legend.position=c(0.1,0.5)) 
gg 

In obigem Code, mit geom-Punkt, den ich die Lage der verschiedenen Koordination auf der Karte zeigen. Aber meine Bezirkskolorierung ist falsch. Können Sie mir bitte sagen, wie ich meine Karte basierend auf dem "coord" -Datensatz kolorieren kann.

+0

@hrbrmstr können Sie mir bitte helfen, auf diesem. – Behzad

+0

Wird versuchen, sobald ich zu Hause bin. Hier kann ich nicht auf die Datei zugreifen, die Sie von der Website herunterladen möchten ... – Umberto

Antwort

0

Sie müssen eine "Räumliche Verbindung" der Anzahl der Punkte durchführen, die jedes Polygon schneiden. Daher müssen die Punkte in ein SpatialPoints Objekt konvertiert werden.

pointsSp <- SpatialPoints(coords = coord[,c("LON", "LAT")], 
          proj4string = CRS(proj4string(nyc_districts))) 

Danach nehmen wir jedes Polygon des nyc_districts und die Anzahl der Punkte in jedem berechnen.

nyc_districts$pointCount <- 0 
for(i in 1:length(nyc_districts)){ 
    x <- nyc_districts[i,] 
    nyc_districts$pointCount[i] <- length(pointsSp[x,]) 
} 

Sie dann einfach Ihre choro Linie auf den folgenden Code ändern, die im Grunde die sample(...) ändert (was dort zu Testzwecken war ...) an die Variable, die wir oben erstellt. Danach legen Sie die Handlung, wie Sie es in Ihrem Q. tat

choro <- data.frame([email protected]$BoroCD, 
        fill=nyc_districts$pointCount) 

Das Ergebnis sieht wie folgt aus: result

+0

, wenn ich die legend.my Legende von Pick-up-Verteilung zwischen 0 und 1 überprüft. – Behzad

+0

Sorry, mein schlechtes. Ich hatte einen Fehler in meinem Code. Ich habe die Zeile 'nyc_districts $ pointCount [i] <- length (x [pointsSp,])' geändert, es sollte jetzt funktionieren. Lassen Sie uns die Kommentarsitzung aufräumen – loki

+0

Wie kann ich den Namen jedes Bezirks als Legende oder auf der Karte zeigen. – Behzad

Verwandte Themen