*** R programı ile ilgili eski dökümanlara ulaşmak için lütfen buraya tıklayınız.***
Veri analizi ve görselleştirmenin öneminin giderek arttığı bu dönemde, bu trende bağlı olarak spatial(konumsal) verinin kullanımı da önem kazandı. Özellikle demografik konuların, örneğin işszilik oranı, göç oranı vs grafiksel olarak sunumu, spatial dataların en çok kullanıldığı yer olarak gösterilebilir.
R’da spatial dataları görselleştirmek için çeşitli yollar mevcut. Bunlardan biri Hadley Wickham tarafından bir haftasonu projesi olarak ortaya çıkan ggplot2
kütüphanesi kullanarak harita çizdirme, bir diğeri ise ggmap
kütüphanesi kullanarak harita çizdirme. Ayrıca en çok kullanılan yollardan biri de maps
kütüphanesi kullanarak harita çizimi. Bu dosyada ggplot2
vemaps
kütüphaneleri kullanarak harita çizimi konusuna bakacağız. ggmap
ise yolda. :)
İlk olarak konumuzla alakali kütüphaneleri yükleme ve ardından çağırma işlemlerini yapmak zorundayız.
install.packages("tidyverse")
install.packages("sp") #for spatial data
install.packages("map")
install.packages("mapproj")
install.packages("ggmap")
install.packages("DeducerSpatial")
install.packages("maps")
maps
Kullanarak Harita Çizimi
Bu örneğin İngilizce hali bu linkte bulabilirsiniz.
İnternette maps
kütüphanesi kullanarak R’da harita çizdirmek diye aratma yaptığınız zaman, en çok göreceğiniz örnek Amerika’ya ait. Bunun nedeni ise maps
kütüphanesinin indexinde saklı. help(package='maps')
komutunu çalıştırdıktan sonra yardım menüsünde gelen listeye baktığınızda, bu kütüphanede sınırlı sayıda-Amerika, İtalya, Yeni Zelanda, Fransa, Çin ve Kanada- ülke haritasının olduğunu görüyorsunuz.
require(maps)
## Loading required package: maps
map("usa") #map komutu harita ve poligon çizimi için kullanılıyor
Eğer Amerika haritası eyaletlerine bölünmüş olarak çizdirmek istiyorsanız, map komutunun içine maps
kütüphanesinin içinde yer alan county seçeneğini kullanabilirsiniz.
map("county")
Uygulama
Amerika’daki eyaletlerin işsizlik oranlarının, oranların büyüklüğüne göre renklendirilmiş haritada gösterilmesi.
data(unemp) #data komutu yardımıyla R'ın içerisinde yer alan dataları enviromentimizie yüklüyoruz.
data(county.fips)
head(unemp) #datamızın ilk 6 satırını görmek için head komutunu kullanıyoruz.
Bu datasetinde fips kolonunun altındaki sayılar eyaletlere karşılık gelirken, pop kolonu bu eyaletlerin populasyonlarını, unemp kolonu da işsizlik yüzdelerini göstermekte.
head(county.fips)
County.fips dataseti ise 2 kolondan oluşmakta. fips kolonu tıpkı bir önceki datasetinde olduğu gibi eyaletleri gösterirken, polyname kolonu fips numaralarına karşılık gelen eyaletlerin isimlerini göstermekte.
colors = c("#F1EEF6", "#D4B9DA", "#C994C7", "#DF65B0", "#DD1C77", "#980043")
Burada birbirine yakın tonlarda 6 adet renk belirledik. 6 adet renk belirlememiz tamamen tercihimize bağlı, çünkü işsizlik oranını 6 aralığa bölerek yapmak istedik bu örnekte. Ancak siz bu sayıyı azaltabilir ya da arttırabilirsiniz.
unemp$colorBuckets <- as.numeric(cut(unemp$unemp, c(0, 2, 4, 6, 8, 10, 100)))
head(unemp)
Burada unemp datamıza colorBuckets adında yeni bir değişken oluşturduk. Bu değişkeni oluştururken cut komutundan faydalandık. cut
komutu herhangi bir numerik değişkeni belirlenilen aralıklara bölmeden kullanılır. Daha fazla detay için bu adresi ziyaret edebilirsiniz
colorsmatched <- unemp$colorBuckets[match(county.fips$fips, unemp$fips)]
map("county", col = colors[colorsmatched], fill = TRUE, resolution = 0, lty = 0, projection = "polyconic")
# Add border around each State
map("state", col = "white", fill = FALSE, add = TRUE, lty = 1, lwd = 0.2, projection = "polyconic")
title("Eyaletlerin işsizlik oranı / Amerika, 2009")
leg.txt <- c("<2%", "2-4%", "4-6%", "6-8%", "8-10%", ">10%")
legend("topright", leg.txt, horiz = TRUE, fill = colors)
ggplot2
Kullanarak Harita Çizimi
ggplot2
kullanımına dair temel bilgiler için lütfen tıklayın
Yukarıdaki örnekte de görüldüğü gibi maps kütüphanesini kullanarak R’da haritasını çizdirebileceğimiz ülkelerin sayısı kısıtlı. Ancak ggplot kütüpanesi kullanarak, spatial datasını indirdiğiniz her ülkenin haritasını kolayca çizdirebilirsiniz. Bu örnekte 2015 yılında TUİK tarafında yayınlanan Türkiye’de illere göre mutluluk endeksi datasını ve aşağıda yazan siteden elde edilen Türkiye’nin spatial datasını birleştirerek bir harita grafiği elde edeceğiz.
İlk olarak bu adresteki linkten Türkiye’yi seçip, dosya formatı olarak da R (SpatialPolygonsDataFrame)
’i seçiyoruz. Not: Buradan indireceğiniz veriyi ticari amaçla kullanamazsınız.
Ardından ekranınıza her bir R dosyasının yanında yazan level 0
, level 1
ve level 2
seçeneklerini göreceksiniz. Bunlardan level 0
, il ve ilçelerin olmadığı sadece Türkiye ülke sınırlarının yer aldığı dosyadır.Öte yandan level 1
il sınırlarının dahil olduğu, level 2
ise ilçe sınırlarının da dahil olduğu dosyadır. Bu örnekte illerle ilgilendiğimiz için biz level 1
i indiriyoruz.
require(tidyverse)
## Loading required package: tidyverse
## -- Attaching packages ---------------------------------------------------------------------------- tidyverse 1.2.1 --
## <U+221A> ggplot2 2.2.1 <U+221A> purrr 0.2.5
## <U+221A> tibble 1.4.2 <U+221A> dplyr 0.7.6
## <U+221A> tidyr 0.8.1 <U+221A> stringr 1.3.1
## <U+221A> readr 1.1.1 <U+221A> forcats 0.3.0
## -- Conflicts ------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
## x purrr::map() masks maps::map()
library(sp) # Konumsal (Spatial) veri için
Spatial veriyi okutma;
tur<- readRDS("turkey.rds") #reading a spatial data
plot(tur)
Verinizi okuttuktan sonra plot
komutu ile kolayca görselleştirebilirsiniz, ancak başlıkta da belirtildiği gibi biz bu görselleştirmeyi ggplot2 kütüphanesinin komutlarını kullanarak yapacağız.
tur@data %>% as_tibble() %>% head(10)
Datayı tibble dosyası haline getirdik, böylece ilerleyen aşamalarda tidyverse
içerisinde yer alan tidyr
kütüphanesindeki left_join
komutunun kullanımını kolaylaştırdık. Ardından head
komutu ile datanın ilk 10 satırına göz attık.
ID_0
: Ülke Kimlik Numarası
ID_1
: Şehirlerin kimlik numaraları, bu numaraları plaka kodları ile karıştırmayın.
ID_2
: Bu veride yok ancak ilçelerin kimlik numaraları
Aynı şekilde,
NAME_0
: Ülke ismi
NAME_1
: Şehir isimleri
NAME_2
: İlçe İsimleri
ggplot(tur,aes(x=long,y=lat))+geom_polygon()
## Regions defined for each Polygons
Bu haritanın beklenilenden farklı çıkmasının sebebi, ggplot komutunun elimizdeki veriyi tam olarak anlamamasından kaynaklanıyor.
ggplot(tur, aes(x = long, y = lat)) + geom_polygon(aes(group = group)) + coord_fixed()
## Regions defined for each Polygons
Ülke sınırlarını çizdirdikten sonra şehirlere bölmek için sp kütüphanesinin içindeki fortify
fonksiyonunu kullanacağız.
tur_for <- fortify(tur) # Bu fonksiyon 'sp' paketinin içinde.
## Regions defined for each Polygons
head(tur_for) #her ilin lattitude ve longitude değerleri gösterililyor
ggplot(tur_for) + geom_polygon(aes(x = long, y = lat,group = group),color = "white",fill = "red") +
theme_void() + coord_fixed()
Şimdi TUİK’ten indirdiğimiz excel dosyasını okutuyoruz. Konu başında da belirtildiği gibi data, Türkiye’deki 81 ilin mutluluk endeksini göstermekte.
mutluluk=read.csv("mutluluk.csv",header=T,sep=";")
head(mutluluk)
Bu noktada karşımıza ufak bir problem çıkıyor.
head(tur@data$NAME_1)
## [1] "Adana" "Adiyaman" "Afyon" "Agri" "Aksaray" "Amasya"
head(mutluluk$sehir)
## [1] Adana Adıyaman Afyonkarahisar Ağrı
## [5] Amasya Ankara
## 81 Levels: Adana Adıyaman Afyonkarahisar Ağrı Aksaray Amasya ... Zonguldak
Görüldüğü üzere spatial data ve okuttuğumuz datada şehir isimleri içinde farklılıklar var. Örn: Afyon ve Afyonkarahisar. Bu soruna ek Türkçe karakter sorunu da bir diğer problem. Bu sorunların çözümü için ise gsub
fonksiyonunu kullanacağız. Bu fonksiyon karakter yapısındaki bir değişkenin içerisinde yer alan bir ya da birden fazla harfin değiştirilmesinde kullanılan bir fonksiyon.
x <- "Ozancan"
gsub("an","on",x)
## [1] "Ozoncon"
turkceden_ingilizceye <- function(dataset){
turkce_harfler<- c("Ç","Ş","Ğ","İ","Ü","Ö","ç","ş","ğ","ı","ü","ö")
ingilizce_harfler<- c("C","S","G","I","U","O","c","s","g","i","u","o")
dataset=mgsub(turkce_harfler,ingilizce_harfler,dataset)
return(dataset)
}
# Multiple gsub function
mgsub <- function(pattern, replacement, x, ...) {
n = length(pattern)
if (n != length(replacement)) {
stop("pattern and replacement do not have the same length.")
}
result = x
for (i in 1:n) {
result <- gsub(pattern[i],replacement[i],result)
}
return(result)
}
tur@data$NAME_1 <- turkceden_ingilizceye(tur@data$NAME_1 )
tur@data$NAME_1 <- gsub("K. Maras", "Kahramanmaras",tur@data$NAME_1 )
tur@data$NAME_1 <- gsub("Kinkkale","Kirikkale",tur@data$NAME_1 )
tur@data$NAME_1 <- gsub("Zinguldak", "Zonguldak", tur@data$NAME_1 )
tur@data$NAME_1 <- gsub("Afyon","Afyonkarahisar", tur@data$NAME_1 )
mutluluk$sehir=turkceden_ingilizceye(mutluluk$sehir)
Yukarıda yazdığımız fonksiyon yardımıyla TÜİK’ten indirdiğimiz datadaki il isimlerini İngilice karaktere uygun bir hale getiriyoruz.
mutluluk%>%as_tibble
left_join
kullanmak için tibble değişken tipine çeviriyoruz.
id_and_cities<- data_frame(id = rownames(tur@data), sehir = tur@data$NAME_1) %>% left_join(mutluluk, by = "sehir")
left_join
kullanarak iki datayı ortak değişken olan şehir isimleri kesişecek şekilde birleştiriyoruz.
head(id_and_cities)
Artık son aşama. Yukarıdaki kodlarda da görüldüğü gibi ggplot kullanarak haritalama işlemi yapmak istiyorsanız elinizdeki datada mutlaka lattitude ve longitude değerleri olmak zorunda. Bu yüzden birkez daha left_join
kullanarak bir önceki stepte oluşturduğumuz dataya şehirlerin lattitude ve longitude değerlerini ekliyoruz.
final_map <- left_join(tur_for, id_and_cities, by = "id")
head(final_map)
ggplot(final_map) +geom_polygon( aes(x = long, y = lat, group = group, fill = mutluluk), color = "grey") +
coord_map() +theme_void() + labs(title = "Türkiye'nin illere göre mutluluk indeksi-2015",caption = "Kaynak: Türkiye Istatistik Kurumu") +
scale_fill_distiller(name = "Mutluluk indeksi",palette = "Spectral", limits = c(0,100), na.value = "white") +
theme(plot.title = element_text(hjust = 0.5),plot.subtitle = element_text(hjust = 0.5))
Soru ve görüşleriniz için ozancan@metu.edu.tr adresine e-mail yollayabilirsiniz.