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.
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
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 alpha
dır. Grafik komutları +
sembolüyle birbirlerine bağlanır (bu durum dplyr
daki %>%
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 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.
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.
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 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
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="")
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.
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.