Özet

Bu dökümanın amacı en azından temel bilgisayar kabiliyetlerine1 sahip olan kişileri olabilecek en hızlı bir şekilde R ile veri analizinde bir şeyler oluşturabilecek seviyeye getirebilmektir.

Gerekli kurulum adımlarını bir önceki dplyr dökümanında bulabilirsiniz. Bu dökümanda ggplot2 ile grafik oluşturma anlatılacaktır.

Hazırlık

dplyr dökümanında olduğu gibi bu dökümanda da 7 Haziran seçimleri Uşak ili verileriyle çalışacağız. İlgili hazırlık kodlarını aşağıda bulabilirsiniz.

#Bu kodlar sadece bazı genel ayarları içeriyor
#Veri alırken string formatındaki sütunları faktör gibi görme
options(stringsAsFactors=FALSE)
#Paketleri bu adresten yükle
options(repos="http://cran.rstudio.com/")
#Veri tablolarının bütün sütunlarını göster
options(dplyr.width = Inf)
#Ondalık veri gösterme formatı ile ilgili bir ayar
options(scipen = 7)

#Bu paket kullanacağımız verileri içeriyor
# devtools::install_github("berkorbay/secimler")

library(secimler)

#Yeni değişkenimizin adı usak_data olsun
usak_data <-
#secim_data değişkenini al
secim150607g %>%
#filtrele
#il Uşak olsun, toplam değerlerini de at
filter(il == "Uşak" & cevre_turu != "Toplam" & cevre_turu != "Cezaevi")

ggplot2’ya Giriş

ggplot2 R grafiklerinde görsel anlamda bir şölen yaşamak için kullanılabilecek en rahat pakettir. Sadece temel özelliklerinde bile güzel ve işlevsel görseller vermeyi başarırken sunduğu geniş seçeneklerle grafikleri parameterik olarak makyajlamayı sistematik bir hale getirmektedir2. Güzellikleri bununla da bitmeyen paket üzerine başka paketler de yazılmasına imkan vermektedir. Örneğin, ggthemes paketi ile grafiklerinizi tek satırlık bir komutla Financial Times veya Economist’te kullanılan formatlara büründürebilirken, ggnetwork paketi ile sadece grafikler değil ağ görselleştirmelerini de ggplot2 formatında yapabilirsiniz.

ggplot2’nin kendine has bir yapısı bulunmaktadır. Baştaki gg, “grammar of graphics” (grafiklerin dil bilgisi) anlamına gelmektedir. Bu yapının içerisinde şekiller (geometry, geom), veri sunumları (stat, stat), görseller (aesthetics, aes) ve ölçekler (scale, scale) gibi fonksiyonlar önemli yer tutmaktadır. Bu fonksiyonların içerisindeki başlıca parametreler ise data, x, y, fill, color, group, shape ve alphadır. Grafik komutları + sembolüyle birbirlerine bağlanır (bu durum dplyrdaki %>% operatörüne benzerdir).

Aşağıda örnek bir nokta grafigi icin bir ggplot2 ifadesi bulabilirsiniz. Canlı örneklerde tekrar edeceğiz.

ggplot(data=veri_seti,aes(x=yatay_element,y=dusey_element)) + geom_point(aes(color=grup_verisi)) + theme(legend.position="top")

Son olarak, grafikleri bir obje olarak saklayıp sonradan bu objelerin üzerine eklemeler yapabilirsiniz. Ayrıca komutu tek satırda değil birden çok satırda yazabilirsiniz (sadece + sembolünün satırın sonunda kaldığına emin olun) Örneğin yukarıdaki komut aşağıdaki şekilde yazılabilir.

grafigim <- ggplot(data=veri_seti,aes(x=yatay_element,y=dusey_element)) + geom_point(aes(color=grup_verisi))

grafigim +
theme(legend.position="top")

Nokta Grafiği (Scatter Plot)

Nokta grafiği geom_point fonksiyonuyla zahmetsizce yapılabilir. Diyelim ki, sandıklarda seçmen sayısı ve katılım oranı arasındaki ilişkiyi görmek istiyoruz. Bunun için önce her sandıkta seçime katılım oranını hesaplamamız gerekir. Daha sonra da ggplot

#Katılım oranını hesapla
usak_data <- usak_data %>% mutate(katilim_orani = oy_kullanan/kayitli_secmen)
#Grafiği çizdir
katilim_grafigi <-
ggplot(data=usak_data,aes(x=kayitli_secmen,y=katilim_orani)) + geom_point()

katilim_grafigi

Yukarıdaki grafikten görülebildiği kadarıyla hiçbir sandıkta %60ın altında bir katılım bulunmuyor, sandıkların büyük çoğunluğunda %80 üzerinde katılım var. Kayıtlı seçmen sayısı 200-300 arasında olan sandıklarda daha yüksek bir varyasyon var. En fazla sandık 300-400 seçmen aralığında bulunuyor. 6 sandıkta %100 katılım görülüyor. Bir grup sandıkta ise %100 üzeri bir katılım var. Bu katılım sebebi bazı sandık görevlilerinin ve güvenlik görevlilerinin (tutanak ile) kendi kayıtlı oldukları sandıklar dışında oy atmalarından veya kayıt hatasından kaynaklı olabilir.

Diyelim ki bir adım öteye geçmek istedik ve bu katılım oranlarını ilçelere ve seçim çevresine (köy, belde ve mahalle) göre gruplandırabilir miyiz ona bakacağız. Bu sefer geom_point içerisinde color=ilce, shape=cevre_turu parametresi ve değerini kullanacağız. Bu sayede ggplot2 veri setimize bakarak sandıkları bulunduğu ilçe ve seçim çevresi türüne göre farklılaştıracak.

#İlçelere göre renklendirilmiş grafik
katilim_grafigi <-
ggplot(data=usak_data,aes(x=kayitli_secmen,y=katilim_orani)) + geom_point(aes(color=ilce,shape=cevre_turu))

katilim_grafigi

Yukarıdaki grafik bize çoğu kalabalık sandığın merkez ilçede bulunduğunu, ancak en kalabalık sandıkların köylerde bulunduğunu ve çoğu düşük ve yüksek katılım oranlarının Banaz ilçesi kaynaklı olduğunu göstermiş oldu.

Makyajlama

Grafiğimiz bu halde güzel gözükse bile onu daha da güzelleştirmek için bazı adımlar atabiliriz. Bu adımları açıklamayacağım ama kodun içerisindeki yorumlarda kısa açıklamalar bulabilirsiniz.

katilim_grafigi +
#İsimleri düzenle.
labs(x = "Kayıtlı Seçmen Sayısı",
y="Seçime Katılım Oranı",
title="Uşak'ta Sandıklardaki Seçmen Sayısı ve Seçime Katılım Oranı",
color="İlçe",
shape="Seçim Çevresi") +
#Y ölçeğini yüzdeye çevir
scale_y_continuous(labels=scales::percent) +
# Renk lejantı tek sıra olsun
scale_color_discrete(guide=guide_legend(nrow = 1)) +
#lejantları tepeye koy, grafik başlığı ortalansın
theme(legend.position="top",
plot.title=element_text(hjust=0.5))

Daha derli toplu gözüktü değil mi? Genellikle makyajlama deneme yanılma içeren bir süreçtir, ama verinizi ve analizi iyi aktarabilmek için de son derece gereklidir.

Çizgi Grafiği (Line Plot)

Not: Çizgi grafikleri genelde ardıllık içeren veriler (ör. dolar kuru, yıllar içerisindeki nüfus seviyesi gibi zaman serileri) için uygundur. Kullandığımız örnek veri setinde böyle bir ardıllık bulunmamaktadır. Yine de örnek olması açısından bir çizgi grafiği yapacağız. (Anlamı: Siz, siz olun bu tarz verilerle bu şekilde grafik yapmayın.)

Aşağıdaki çizgi grafiği her sandıktaki AK Parti ve CHP oy sayılarını bize gösteren bir çizgi grafiğidir. Burada yukarıdaki örnekten farklı olarak üst üste iki tane çizgi grafiği çizdirdik. Kullandığımız ak_parti ve chp sütunlarının çizgi grafiğine yansıması için de color değerine isimler verdik. (Not: color parametresini gerçek bir renk adı (ör. kırmızı, turuncu) ile tanımlamak isteseydik aes dışına yazarak tanımlayabilirdik. Nasıl yapılacağı ise alıştırma olsun.)

ggplot(data=usak_data,aes(x=sandik)) + geom_line(aes(y=ak_parti,color="AK Parti")) + geom_line(aes(y=chp,color="CHP"))

Sütun Grafiği (Bar Plot)

Sütun grafikleri farklı birimlerdeki seviyeleri göstermek için çok uygun grafiklerdir. Elimizdeki veri ile sütun grafiğine uygun çok sayıda görselleştirme yapabiliriz. Örneğin, ilk olarak her ilçedeki seçmen sayısını gösterelim. Önce ilçelere göre gruplama yapıp seçmen sayılarını toplayalım.

usak_ilceler_veri <-
usak_data %>%
group_by(ilce) %>%
summarise(kayitli_secmen=sum(kayitli_secmen)) %>%
ungroup()

Şimdi de elimizdeki veriyi bir sütun grafiğine çevirelim. Sütun grafiğine çevirmek için geom_bar fonksiyonunu kullanıyoruz. stat parametresini identity olarak ayarlıyoruz ve rengini belirlemek için de fill parametresini kullanıyoruz.

ggplot(data=usak_ilceler_veri,aes(x=ilce,y=kayitli_secmen)) + geom_bar(stat="identity",fill="#00FF84")

Peki yanlarına ana partilerin oy oranlarını da koymak isteseydik nasıl bir grafik yapmamız gerekirdi? Öncelikle verimizi hazırlıyoruz. Aynı ilçe sütunu gibi Kayıtlı Seçmen, AK Parti, CHP, MHP ve HDP oy oranlarının da bir sütunda bulunmasını istiyoruz. Bu sütuna parametre ismini vereceğiz.

usak_ilceler_veri2 <-
usak_data %>%
#İlgili sütunları seç
select(ilce,kayitli_secmen,ak_parti,chp,mhp,hdp) %>%
#parametre ve değer sütunlarını oluştur
gather(key=parametre,value=deger,-ilce) %>%
#ilçe ve parametreye göre grupla
group_by(ilce,parametre) %>%
#sandıktaki değerleri ilçe ve parametreye göre topla
summarise(deger=sum(deger)) %>%
ungroup()

#Veriyi göster
head(usak_ilceler_veri2)
## # A tibble: 6 × 3
##    ilce      parametre deger
##   <chr>          <chr> <dbl>
## 1 Banaz       ak_parti  8390
## 2 Banaz            chp  7454
## 3 Banaz            hdp   220
## 4 Banaz kayitli_secmen 27993
## 5 Banaz            mhp  7362
## 6  Eşme       ak_parti  8173

Yukarıdaki grafiğe son derece benzer bir yapı kullanıyoruz. Değişiklik olarak geom_bar fonksiyonunun içerisinde position parametresini dodge olarak ayarlıyoruz. Bunu yapmamızın sebebi aynı ilçeye ait sütunların yan yana kullanılabilmesi. (Not: dodge yerine stack yazıyor olsaydık üst üste görünecekti.) Ayrıca aes içerisindeki fill parametresini de parametre sütunumuzu kullanarak oluşturuyoruz (ordered kullanılmadığı zaman ggplot2 sütunları isim sırasına göre diziyor).

parti_ilce_oy_grafik<-
ggplot(data=usak_ilceler_veri2,aes(x=ilce,y=deger,fill=ordered(parametre,levels=c("kayitli_secmen","ak_parti","chp","mhp","hdp")))) + geom_bar(stat="identity",position="dodge") + labs(fill="")

parti_ilce_oy_grafik

Daire Grafiği (Pie Chart)

Bu bölümdeki son grafiğimiz daire grafiği. İlginçtir ki bu grafiği de geom_bar kullanarak yapacağız. Bu grafikte Uşak ilindeki oy oranları ile ilgili bir grafik yapacağız. Önce il genelindeki oy oranlarını hesaplayalım.

usak_oranlar <-
usak_data %>%
#İlgili sütunları seç
select(gecerli_oy,ak_parti,chp,mhp,hdp) %>%
#Oyları topla
summarise_each(funs(sum)) %>%
#Diğer partilerin oylarını hesapla
mutate(diger=gecerli_oy - ak_parti - chp - mhp - hdp) %>%
#Oranlara çevir
summarise_each(funs(./gecerli_oy),-gecerli_oy) %>%
#Verinin şeklini düzenle
gather(parti,oy_orani) %>%
mutate(parti=ordered(parti,levels=c("ak_parti","chp","mhp","hdp","diger")),
#Konum grafik yaparken oy oranlarını yazdırdığımızda işe yarayacak.
konum=1-(cumsum(oy_orani)-oy_orani/2))

#Veriyi göster
usak_oranlar
## # A tibble: 5 × 3
##      parti   oy_orani      konum
##      <ord>      <dbl>      <dbl>
## 1 ak_parti 0.38040117 0.80979941
## 2      chp 0.28354784 0.47782491
## 3      mhp 0.27872918 0.19668640
## 4      hdp 0.02348547 0.04557908
## 5    diger 0.03383634 0.01691817

Şimdi de grafiği yapalım. geom_bar fonksiyonundan sonra bir de coord_polar yaptığımızda daire grafiğimiz hazırdır. theme_void ufak bir “makyajlama adımı” olarak görülebilir. geom_text ise oy oranlarını ayrıca yazdırmak için kullanılmıştır.

    ggplot(data=usak_oranlar,aes(x="",y=oy_orani,fill=parti)) +
    geom_bar(stat="identity",width=1) +
    coord_polar("y",direction=-1) +
    #Temayı boş tut
    theme_void() +
    #Oy oranlarını ekle
    geom_text(aes(label = paste0("%",round(oy_orani,4)*100),y=konum,x=1.1),size=6,angle=0) +
    #Lejant başlığını kaldır
    labs(fill="")

Peki bütün ilçeler için bir grafik yapmak isteseydik ve bunları beraber isteseydik? O zaman yardımımıza facet_wrap koşsun.

usak_oranlar2 <-
usak_data %>%
#İlgili sütunları seç
select(ilce,gecerli_oy,ak_parti,chp,mhp,hdp) %>%
group_by(ilce) %>%
#Oyları topla
summarise_each(funs(sum)) %>%
#Diğer partilerin oylarını hesapla
mutate(diger=gecerli_oy - ak_parti - chp - mhp - hdp) %>%
#Oranlara çevir
group_by(ilce) %>%
summarise_each(funs(./gecerli_oy),-gecerli_oy,-ilce) %>%
#Verinin şeklini düzenle
gather(parti,oy_orani,-ilce) %>%
mutate(parti=ordered(parti,levels=c("ak_parti","chp","mhp","hdp","diger"))) %>%
group_by(ilce) %>%
#Konum grafik yaparken oy oranlarını yazdırdığımızda işe yarayacak.
mutate(konum=1-(cumsum(oy_orani)-oy_orani/2))

#Veriyi göster
head(usak_oranlar2)
## Source: local data frame [6 x 4]
## Groups: ilce [6]
## 
##          ilce    parti  oy_orani     konum
##         <chr>    <ord>     <dbl>     <dbl>
## 1       Banaz ak_parti 0.3455377 0.8272312
## 2        Eşme ak_parti 0.3338917 0.8330542
## 3   Karahallı ak_parti 0.4277995 0.7861002
## 4     Sivaslı ak_parti 0.3785838 0.8107081
## 5      Ulubey ak_parti 0.3514847 0.8242577
## 6 Uşak Merkez ak_parti 0.3936313 0.8031844
ggplot(data=usak_oranlar2,aes(x="",y=oy_orani,fill=parti)) +
geom_bar(stat="identity",width=1) +
coord_polar("y",direction = -1) +
#Sihirli komut
facet_wrap(~ilce) +
theme_void() +
geom_text(aes(label = paste0("%",round(oy_orani,4)*100),y=konum,x=1.1),size=4,angle=0) +
labs(fill="")

Tema Değişiklikleri

Temel ggplot2 eğitiminin bir parçası olmasa da theme fonksiyonu grafikleri güzelleştirmek için öğrenilmesi son derece faydalıdır. Şahsen theme fonksiyonunun parametrelerini anca ihtiyacım olduğu zaman kullandığım için bu konuda genel bir harita çizemeyeceğim. Onun yerine yukarıdaki ilk daire grafiğini biraz daha düzgün bir hale getireceğim.

ggplot(data=usak_oranlar,aes(x="",y=oy_orani,fill=parti)) +
geom_bar(stat="identity",width=1) +
coord_polar("y",start=1/3,direction = -1) +
scale_fill_manual(values=c("#E4670C","#D6001C","#003f91","#7330b4","grey"),labels=c("AK Parti","CHP","MHP","HDP","Diğer"),position="bottom") +
scale_y_continuous(expand=c(0,0)) +
scale_x_discrete(expand=c(0,0)) +
theme_void() +
theme(
legend.position="top",
panel.spacing.x = unit(0, "lines"),
panel.spacing.y = unit(0, "lines"),
strip.text.x = element_text(size = 12, face = "bold", angle = 0,vjust=-1),
axis.text.x=element_blank(),
panel.border=element_rect(colour = "grey", fill=NA, size=0),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
strip.background = element_rect( fill="grey", size=0.2),
panel.background = element_rect( color="grey",fill=NA, size=0)
 ) +
 geom_text(aes(label = paste0("%",round(oy_orani,4)*100),y=konum,x=1.7),size=6,angle=0) +
labs(fill="")

Bunların dışında da hazır temaları kullanabilirsiniz. theme_void fonksiyonu dikkatinizi çekmiştir, aslında bir hazır temadır ve parametre değerleri önceden belirlenmiş theme fonksiyonu gibidirler. Tabi daha detaylı ve güçlü temalar da isteyebilirsiniz. Bunun için ggthemes paketini önerebilirim.

# Paketi indirmediyseniz aşağıdaki kodu çalıştırın
# install.packages("ggthemes")
library(ggthemes)

Yukarıdaki grafiklerden birini hatırlayalım: İlçe bazında seçmen sayısı ve parti oyları. Üzerinde değişiklik yapmadığımız grafiğimiz buydu.

parti_ilce_oy_grafik

Wall Street Journal temasını kullanarak tamamen farklı bir şekle büründürebiliriz. Basitçe grafiğin arkasına + theme_wsj() fonksiyonunu ekliyoruz.

parti_ilce_oy_grafik + theme_wsj()

Veya çok ünlü bir veri haberciliği sitesi olan fivethirtyeight’in grafiklerine benzetebiliriz…

parti_ilce_oy_grafik + theme_fivethirtyeight()

Veya Economist dergisininkine…

parti_ilce_oy_grafik + theme_economist()

Daha pek çok tema için ilgili paketi inceleyebilirsiniz.

Sonuç

ggplot2 R ortamında grafik oluşturmak için son derece esnek ve görsel olarak estetik bir pakettir. Ayrıca ggplot2 kendisine ek paketlerle daha da zenginleştirilebilir (ör. ggthemes).

İki boyutlu grafikler hızlı ve etkili bir görsel anlatım için son derece güçlü bir yoldur. Yalnız grafiklerin estetik olarak güzel görünmeleri ve anlaşılır olmaları (özellikle tek bir şey anlatmaları) gerekmektedir.

İnternet üzerinde pek çok kaynakta ggplot2 ve eklenti paketleri ile ilgili bilgiler bulabilirsiniz. Aşağıya birkaç tanesini sıralıyorum. Sırada ise bütün bildiklerimizi birleştireceğimiz rmarkdown var.


  1. Temel bilgisayar kabiliyetleri = Bilgisayarı açıp/kapama, internete girebilme ve program yükleyebilme. Bir miktar İngilizce de faydalı olur.

  2. Türkçe anlatmak gerekirse theme() diye bir fonksiyonu var parmaklarınızı yersiniz.