R ile Şehir Haritası Yapmak

Yerel ölçekte yapılan çalışmalar hem akademide hem de endüstride gittikçe daha da önem kazanmakta. Bu sayfada R kullanarak nasıl Türkiye’deki şehirlerin haritası üzerinde veri işlenebileceğini ele alacağız. Sayfada anlatılanlar R ile spatial (konumsal) veri üzerinden harita işlemenin devamı niteliğindedir. Konu hakkında başlangıç bilgisine erişmek isteyenler Ozancan Özdemir’in ilgili çalışmasına bakabilirler (link).
İlgili paketleri kütüphanemize yükleyerek başlıyoruz:


library(ggplot2)
library(scales)
library(readxl)
library(tigris)
library(dplyr)
library(leaflet)
library(sp)
library(ggmap)
library(maptools)
library(broom)
library(httr)
library(rgdal)
library(tidyverse)



Paketleri yükledikten sonra bu adresten “Türkiye” seçeneğini seçip R sp (level 2) dosyasını bilgisayarımıza indiriyoruz. “turkey” olarak adlandırdığımız dosyayı workflow’umuza yüklüyoruz:

tur<- readRDS("turkey.rds")  
plot(tur) 

Fortify fonksiyonunu kullanarak her ilçenin enlem ve boylam değerlerini alıyoruz:

tur_for <- fortify(tur) 
head(tur@data)
head(tur_for) 

Ggplot ile temel haritamızın nasıl göründüğüne bakalım:

ggplot(tur_for) + geom_polygon(aes(x = long, y = lat,group = group),color = "white",fill = "red") +
  theme_void() + coord_fixed()

Bu noktadan sonra yapmamız gereken tur_for dosyasındaki enlem ve boylam değerleriyle tur@data dosyasındaki ilçe isimlerini eşleştirmek. Bunu tur_data bulunan ”id” numarasıyla ve tur@data dosyasındaki sıra adlarıyla (row names) yapacağız.

Ancak manuel kontrol bize tur_for dosyasındaki ”id” numarasının tur@data dosyasındakilere göre bir rakam farklı olduğunu gösteriyor. Bunun sebebi tur@data dosyasındaki id’nin sıra adından elde edinmiş olması. Örneğin tur@data dosyasında 117119 olarak kodlanmış olan bir ilçe tur_for’da 117120 olarak gözükmekte. Öncelikle tur@data dosyasındaki sıra adlarını yeni bir sütuna alıp bu farkı düzeltiyoruz:

tur@data$id<-rownames(tur@data)
tur@data$id<-as.numeric(tur@data$id)
tur_for$id<-as.numeric(tur_for$id)
tur_for$id<-tur_for$id-1

“left_join” kodunu kullanarak iki dosyayı eşleştiriyoruz:

match <- left_join(tur_for, tur@data, by = "id")

Bu noktadan sonra üzerine işlem yapacağımız ili seçmemiz gerekiyor. Bunun için ”HASC_2” sütunundan seçme yapacağız.

unique(match$HASC_2)

Buradaki ilk iki karakter (TR) ülke kodu, dördüncü ve beşinci karakter il kodu, yedinci ve sekizinci karakterse ilçe kodudur. Örneğin Afyon’un ilçeleri ”TR.AF” ile Bursa ilçeleri ise ”TR.BU” ile başlamaktadır. Örneği Bursa üzerinden vereceğimiz için Bursa verilerini dataset’ten çekiyoruz:

bursa_for<-filter(match, grepl("TR.BU", HASC_2))
head(bursa_for)

Eşleşmemiz başarılı olduysa, yani HASC_2 sütunundaki ilçe koduyla NAME_2 sütunundaki ilçe ismi eşleşiyorsa kullanacağımız veriyi yükleyip görselimizi oluşturabiliriz.

Nüfusu.com sitesinden edindiğim ilçe nüfus dağılımının Excel dosyasına buradan ulaşabilirsiniz:

Dosyamızı yükleyip birleştirmeyi yapıyoruz:

ilce_nufus_bursa <- read_excel("ilce_nufus_bursa.xlsx")
names(ilce_nufus_bursa )[names(ilce_nufus_bursa) == "Ilce"] <- "NAME_2"
final_map <- left_join(bursa_for, ilce_nufus_bursa, by = "NAME_2")


Son aşamadaysa haritamızı yapıyoruz:

options(scipen=10000)
p2<-ggplot(final_map, aes(x=long, y=lat, group=group)) +
      geom_polygon(aes(fill=Nufus),color = "black")+
       labs(x="",y="")+ theme_bw()+
       coord_fixed()
 
p2<-p2+scale_fill_gradientn(colours=c("white","grey","green"), 
                                  values=rescale(c(0,150000,900000)))
p2<-p2+theme(axis.line=element_blank(),
                      axis.text.x=element_blank(),
                         axis.text.y=element_blank(),
                        axis.ticks=element_blank(),
                         axis.title.x=element_blank(),
                         axis.title.y=element_blank(),
                      panel.grid.major = element_blank(),
                       panel.grid.minor = element_blank(),
                     panel.border = element_blank(),
                       panel.background = element_blank())
 p2<-p2+ theme(legend.position="right")
  p2<-p2+labs(fill = "Nufus",title = "Bursa Nufusu", subtitle = "Kaynak:Nufusu.com", caption = "Salih Yasun")
  p2<-p2+ theme(plot.title = element_text(hjust = 0.5),plot.subtitle = element_text(hjust=0.5))
p2  

Görüş ve önerilerinizi syasun@indiana.edu adresine yazabilirsiniz.