In diesem Beitrag möchte ich zeigen, wie räumliche Standortdaten mit dem Paket ggplot2 in R auf einem Kartenhintergrund visualisiert werden können.
Dazu laden bzw. importieren wir zunächst die entsprechenden R-Pakete. Darüber hinaus definieren wir eine Geokodierungsfunktion mithilfe der Open Street Map-API. Die Geokodierungsfunktion wurde von https://datascienceplus.com/osm-nominatim-with-r-getting-locations-geo-coordinates-by-its-address/ übernommen.
Im nächsten Schritt erfassen wir mithilfe der Funktion map_data aus dem Paket ggplot2 eine Karte in Form eines Datenrahmens, der zum Plotten geeignet ist. Anschließend erstellen wir auch manuell eine Liste der Städtenamen und konvertieren diese Städtenamen mithilfe der Geokodierungsfunktion in Koordinaten.
Mit ggplot2 werden die geokodierten Datenpunkte dann auf einer Weltkarte darstellen.
# relevante Bibliotheken importieren
library(ggplot2)
library(ggrepel)
# osm Geocoder
osm_geocoder <- function(address = NULL)
{
if(suppressWarnings(is.null(address)))
return(data.frame())
tryCatch(
d <- jsonlite::fromJSON(
gsub('\\@addr\\@', gsub('\\s+', '\\%20', address),
'http://nominatim.openstreetmap.org/search/@addr@?format=json&addressdetails=0&limit=1')
), error = function(c) return(data.frame())
)
if(length(d) == 0)
return(data.frame())
return(data.frame(lon = as.numeric(d$lon), lat = as.numeric(d$lat)))
}
# Kernteil
# Datenaufbereitung
world <- map_data("world")
points_df <- data.frame(matrix(nrow=0,ncol=2))
colnames(points_df) <- c("long","lat")
city_list <- c("New York City, New York, USA",
"Detroit, Michigan, USA",
"Atlanta, Georgia, USA",
"Birmingham, Alabama, USA",
"Miami, Florida, USA",
"Nashville, Tennessee, USA",
"Knoxville, Tennessee, USA")
for(i in city_list){
dum_coord <- osm_geocoder(i)
points_df <- rbind(points_df,data.frame("long"=c(as.numeric(dum_coord[1])),"lat"=c(as.numeric(dum_coord[2]))))
}
gg_1 <- ggplot(world) +
geom_polygon(mapping=aes(x=long,y=lat, group=group),fill="white",colour="black")
gg_dots <- gg_1 + geom_point(data=points_df,mapping=aes(x=long, y=lat),colour="red",size=3)
gg_text <- gg_dots + geom_text_repel(data=data.frame("long"=points_df$long,"lat"=points_df$lat,"city"=city_list),
mapping=aes(x=long,y=lat,label=c("New York",
"Detroit",
"Atlanta",
"Birmingham",
"Miami",
"Nashville",
"Knoxville")),
color="blue",
size=6)
# den Plot ausgeben
gg_text
Wirtschaftsingenieur mit Interesse an Optimierung, Simulation und mathematischer Modellierung in R, SQL, VBA und Python
Leave a Reply