R ortamında proje açılarak çalışmaya başlanmalı ve gerekli paketler
yüklenmelidir. ggplot2, R’ı dünya çapında meşhur eden
tidyverse mega paketinin içerisindeki “Grammar of Graphics”
(Grafiğin Grameri) felsefesine dayanan bir görselleştirme paketidir.
Çalışma mantığı, boş bir sofra bezi (kanvas) serip, geometrik ve estetik
objeleri Lego gibi üst üste eklemeye (katmanlı yapıya) dayanır.
Öncelikle SPSS dosyalarını çekmek için haven, veri seti
etiketlerini okumak için labelled ve veri
düzenleme/görselleştirme için tidyverse paketleri R
ortamına indirilir ve çalıştırılır.
# Bu kodlar paketler yüklü değilse bir kere çalıştırılmalıdır.Tırnak içinde yazınız.
install.packages("haven")
install.packages("labelled")
install.packages("tidyverse") #ggplot2 paketi içindedir.
# Gelecek hafta dplyr paketi anlatılacaktır.(Veri Düzenleme) Bu paket de tidyverse içindedir.
SPSS veri seti (.sav uzantılı), bilgisayardan bulunarak
dosyamıza aktarılır. TGSS_2024 veri dosyasının çalıştğımız
klasörde olmasını lütfen sağlayalım.
# Paketleri kütüphaneye çağıralım.Tırnak kullanmayınız.
library(haven)
library(tidyverse)
## Warning: package 'dplyr' was built under R version 4.5.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.1 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 4.0.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(labelled)
# Veri setini R'a okutalım
TGSS <- read_sav("TGSS_2024.sav")
Etiket kütüphanesini görmek için kullanılan kod:
TGSS_degiskenler <- look_for(TGSS)
TGSS_degiskenler
R’ın değişkenleri nasıl tanıdığı (sayısal mı, kategorik mi) çok önemlidir. Sayısal değişkenler için sorgu şu şekilde yapılır:
is.numeric(TGSS$gender)
## [1] TRUE
Bir değişkenin frekans tablosunu almak için:
table(TGSS$gender)
##
## 1 2
## 1331 1284
Sayısal (numeric) olarak gelen bir değişkeni, etiketleriyle (kadın/erkek vb.) kategorik bir formata (faktöre) dönüştürmek için aşağıdaki kodlar kullanılır:
table(as_factor(TGSS$gender))
##
## Erkek Kadın
## 1331 1284
Eğer haven paketine ait özel faktör dönüştürücü
özellikle kullanılmak istenirse yani bir başka pakette de bu komut var
ise ve biz mutlaka haven paketine ait olanı kullanmak
istiyorsak aşağıdaki gibi komutu yazarız.
table(haven::as_factor(TGSS$gender))
##
## Erkek Kadın
## 1331 1284
Tüm veri setindeki değişkenleri tek seferde faktöre dönüştürmek için:
TGSS <- as_factor(TGSS)
Bu komuttan sonra değişkenlerin hepsi faktöre dönüşmüştür. Örneğin degurbayı kontrol edelim
is.factor(TGSS$degurba) # sonuc TRUE gelir.
## [1] TRUE
Grafik oluştururken işlemler + işareti ile birbirine
bağlanarak eklenir.
ggplot() komutu ile boş bir kanvas oluşturduk.
ggplot()
data= argümanı ile veri setimiz girilir. X eksenine
“gender” (cinsiyet) atamak için aes (estetik - aesthetics)
argümanı ile x ekseninde cinsiyet olacağız tarif edilir.
ggplot(data = TGSS, mapping = aes(x = gender))
Bu kod sadece eksenleri çizer. Sütun objelerini getirmek için
geom_bar() eklenir:
ggplot(data = TGSS, aes(x = gender)) + geom_bar()
Bir başka değişken (kentleşme derecesi) için kısaltılmış yazım: (data = yazmadan da ilk olarak data setimizi direkt yazabilirdik. Yine mapping yazmaya da gerek yoktur.)
ggplot(data = TGSS, aes(x = degurba)) + geom_bar()
Kategorik bir değişken histograma sokulmaya çalışıldığında R hata
verir; bu yüzden verinin as.numeric ile sayısal formata
çevrilmesi gerekir. bins= argümanı ile aralık (sütun
sayısı) belirlenebilir.
ggplot(TGSS, aes(x = as.numeric(income))) + geom_histogram(bins = 30)
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_bin()`).
Aslında kategorik olan educ değişkenini nümerik al deseydik aşağıdaki gibi komutu yazardık.
ggplot(TGSS, aes(x = as.numeric(educ))) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
Şimdi tekrar aşağıdaki grafiğe gelelim.
ggplot(data = TGSS, aes(x = degurba)) + geom_bar()
Sütunların içini doldurmak için fill, saydamlığını
ayarlamak için alpha, dış kenar çerçevesini renklendirmek
için colour, çizgi kalınlığını ayarlamak için ise
linewidth kullanılır.
fill ile içinin rengini değişterelim
ggplot(data = TGSS, aes(x = degurba)) + geom_bar(fill = "navy" )
alpha değeri 1 olursa yukarıdaki görüntünün kendisidir
küçültürsek saydamlaşma başlar.
ggplot(TGSS, aes(x = degurba)) + geom_bar(fill = "navy", alpha = 0.5)
Dış kenar çerçevesini renklendirmek için colourı
kullanalım
ggplot(TGSS, aes(x = degurba)) +
geom_bar(fill = "navy", alpha = 0.8, colour = "red")
Çizgi kalınlığını ayarlamak için ise linewidth
kullanalım.
ggplot(TGSS, aes(x = degurba)) +
geom_bar(fill = "navy", alpha = 0.8, colour = "red", linewidth = 1)
Şimdi marital değişkeninin grafiğini yapalım.
Ama önce data setimizi tekrar yükleyelim. Çünkü herşey faktör olmuştu.
# Veri setini R'a okutalım
TGSS <- read_sav("TGSS_2024.sav")
as_factor olarak tanıtık ki etiketlerini görelim.
ggplot(TGSS, aes(x = as_factor(marital))) + geom_bar(fill = "navy", alpha = 0.5)
fill, colour ve linewidth kullanarak grafiğimizi düzenleyelim.
ggplot(TGSS, aes(x = as_factor(marital))) +
geom_bar(fill = "pink4", colour = "black", linewidth = 1)
EK BİLGİ :ggplot2’de Modüler (Adım Adım) Grafik Oluşturma Tekniği
ggplot2paketinde grafikler nesne tabanlı ve katmanlı (layered) bir yapıda oluşturulur. Bu sayede grafiğin temel iskeletini bir değişkene, her bir görsel katmanı (geom, scale, theme vb.) ise ayrı değişkenlere atayarak kodu çok daha okunaklı, yönetilebilir ve yeniden kullanılabilir hâle getirebilirsiniz.
Hocamızın bu durumu bize izah etmiştir. Aşağıdaki kod tam olarak bu tekniğin basit bir uygulamasıdır:
# 1. Temel grafik nesnesi (ggplot katmanı)
base_plot <- ggplot(TGSS, aes(x = as_factor(marital)))
# 2. Geometrik katman (geom) ve estetik ayarları
bar_layer <- geom_bar(fill = "pink4",
colour = "black",
linewidth = 1)
# 3. Parçaları birleştirme
final_plot <- base_plot + bar_layer
# 4. Grafiği göster
final_plot
X ve Y eksenlerindeki İngilizce veya ham değişken isimlerini
değiştirmek için labs() kullanılır. + ile
eklenir.
Grafikte degurba (Kentleşme Durumu) değişkeni kullanılmıştır.
ggplot(TGSS, aes(x = degurba)) +
geom_bar(fill = "navy",
colour = "red",
linewidth = 1) +
labs(x = "Kentleşme Durumu", y = "Frekans (Sayı)")
Dikey sütunları yataya çevirmek (X ve Y eksenlerinin yerini
değiştirmek) için coord_flip() komutu eklenir.
ggplot(TGSS, aes(x = degurba)) +
geom_bar(fill = "navy",
colour = "red",
linewidth = 1) +
labs(x = "Kentleşme Durumu", y = "Frekans (Sayı)") +
coord_flip()
Yine aynı grafiğimize bakalım.
ggplot(TGSS, aes(x = degurba)) +
geom_bar(fill = "navy",
colour = "red",
linewidth = 1) +
labs(x = "Kentleşme Durumu", y = "Frekans (Sayı)")
Arka plandaki gri rengi ve şablonu değiştirmek için temalar
kullanılır. Örneğin siyah-beyaz arka plan için theme_bw()
veya theme_minimal() tercih edilebilir.
ggplot(TGSS, aes(x = degurba)) +
geom_bar(fill = "navy",
colour = "red",
linewidth = 1) +
labs(x = "Kentleşme Durumu", y = "Frekans (Sayı)") +
theme_bw() # isterseniz theme_minimal() komutunu da kullanabilirsiniz.
Bir Başka Grafik Örneği: Değişken olarak gender (cinsiyet) değişkeni kullanılmıştır.
ggplot(TGSS, aes(x = as_factor(gender))) +
geom_bar(fill = "navy",
colour = "red",
linewidth = 1) +
labs(x = "Cinsiyet", y = "Frekans (Sayı)") +
coord_flip()
İki sayısal değişken (eğitim ve gelir) arasındaki ilişkiyi göstermek
için nokta grafiği (geom_point) kullanılır.
Anlatım kolaylığı olsun diye data setimizi orijinal hali ile tekrar yükleyelim.
# Veri setini R'a okutalım
TGSS <- read_sav("TGSS_2024.sav")
ggplot(TGSS, aes(x = educ, y = income)) + geom_point()
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Noktaları renklendirelim colour ile
ggplot(TGSS, aes(x = educ, y = income)) + geom_point(colour="blue")
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Noktaları büyütme size ile
ggplot(TGSS, aes(x = educ, y = income)) + geom_point(colour="blue", size = 1.5)
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Noktaları büyütme bir değişkene atanmış şekilde
size çalışması
sz = 1.5
ggplot(TGSS, aes(x = educ, y = income)) + geom_point(colour="blue", size = sz)
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Noktaları saydamlaştırma alpha ile
ggplot(TGSS, aes(x = educ, y = income)) + geom_point(colour="blue", alpha = 0.4, size = 1.5)
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Çok fazla aynı değere sahip gözlem olduğunda noktalar üst üste biner.
Bunu çözmek ve gözlemleri “dağıtmak” için geom_point yerine
geom_jitter kullanılır. Dağılımın genişliği
width ile ayarlanır.
ggplot(TGSS, aes(x = educ, y = income)) + geom_jitter(width = 1)
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Etiket ekleme
ggplot(TGSS, aes(x = educ, y = income)) + geom_jitter(width = 1) +
labs(x="Eğitim", y = "Gelir")
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Verideki genel eğilimi göstermek için grafiğe
geom_smooth() eklenir. Metod olarak doğrusal regresyon “lm”
(linear model) belirtilmelidir. Standart hatayı (gri gölge alanı)
gizlemek istenirse se = FALSE argümanı kullanılır.
ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income))) +
geom_jitter(width = 0.5) +
geom_smooth(method = "lm", se = TRUE) +
labs(x="Eğitim", y = "Gelir")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
method = loess kullanmak
ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income))) +
geom_jitter(width = 0.5) +
geom_smooth(method = "loess", se = TRUE) +
labs(x="Eğitim", y = "Gelir")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Teknik Açıklama
loess = Locally Estimated Scatterplot Smoothing (Yerel Tahmini Saçılım Grafiği Düzleştirme)
Bu yöntem, veriyi tümünde tek bir düz çizgi ile özetlemek yerine, her bölgeyi (her eğitim seviyesini) ayrı ayrı inceler.
Her x değeri (her eğitim seviyesi) etrafında yerel bir regresyon yapar ve o bölgedeki noktaların en iyi nasıl özetleneceğini hesaplar.
Sonuçta ortaya çıkan pürüzsüz eğri, eğitim seviyesi değiştikçe gelirin nasıl ve ne şekilde değiştiğini net bir şekilde gösterir.
Trend Çizgisini Renklendirmek,Gölge Vermek,Şeffat Yapmak
Trend çizgisinin rengi (color) ve gölge rengi (fill), şeffaflığı (alpha) değiştirilebilir:
ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income))) +
geom_jitter(width = 1) +
geom_smooth(method = "lm", se=TRUE, fill = "red", color = "darkred", alpha = 0.2, size = 2)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Trendi tüm veriye değil de kadın/erkek olarak iki alt gruba bölerek
ayrı ayrı renkli doğrularla göstermek için genel estetik
(aes) içerisine colour argümanı eklenir.
Değişkenin kategorik görülmesi için as_factor
kullanılmalıdır.
ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income), colour = as_factor(gender))) +
geom_jitter(width = 1, alpha = 0.4) +
geom_smooth(method = "lm", se = TRUE) +
labs(x="Eğitim", y = "Gelir")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Göstergeyi (Legend) aşağı almak için tema ayarı yapılır:
ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income), color = as_factor(gender))) +
geom_jitter(width = 1, alpha = 0.4) +
geom_smooth(method = "lm", se = TRUE) +
labs(x="Eğitim", y = "Gelir")+
theme_bw() +
theme(legend.position = "bottom")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Önemli Not: Kodların sıralaması önemlidir. Önce temayı belirleyip, ardından temanın içerisindeki diğer bileşenleri eklemek daha doğru sonuç verir. Yani önce theme_bw() sonra theme(legend.position = “bottom”) olmalı gibi
Programın atadığı renkler yerine kendi istediğimiz manuel
renkleri atamak için scale_color_manual fonksiyonu
ve values argümanı kullanılır. C (vektör) yapısı içinde
kategori isimlerine karşılık gelen renkler yazılır.
ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income), color = as_factor(gender))) +
geom_jitter(width = 1, alpha = 0.4) +
geom_smooth(method = "lm",fill = "gray", se = TRUE) +
labs(x="Eğitim", y = "Gelir") +
scale_color_manual(values = c("Erkek" = "navy", "Kadın" = "pink4")) + # Değerlerin veri setinizdeki etiketlerle eşleştiğinden emin olun.
theme_bw() +
theme(legend.position = "bottom")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).
Grafikler doğrudan R arayüzünden manuel olarak
Export -> Save as Image yöntemiyle (PNG, SVG, JPEG
olarak) kaydedilebileceği gibi, çok daha profesyonel ve otomatize bir
yöntem olan ggsave kodu ile de kaydedilir.
# 1. Grafiği bir objeye ata
p1 <- ggplot(TGSS, aes(x = degurba)) +
geom_bar(fill="steelblue") +
labs(title = "Kentleşme Düzeyine Göre Dağılım", x = "Kentleşme Düzeyi", y = "Sayı") +
theme_minimal()
RStudio’da Console kısmına p1 yazıp bu satırı
çalıştırdığımızda RStudio’nun Plots ekranında grafik karşımıza gelir.
Burada Export yardımı ile görselimizi ister
image formatında ister pdf formatında
grafiğimizi bilgisayarımıza kayıt edebiliriz.
(Uyarı: Grafikleri kopyala-yapıştır ile Word’e atmak görsel kalitesini çok düşürür, daima dosya olarak dışa aktarılıp Word’e “Resim Ekle” ile alınmalıdır).
ggsave Kodu ile KaydetmeDosyanın genişlik (width), yükseklik (height), kalite (dpi) ve birimi (units) belirlenebilir. Önce bir grafik objesi oluşturulup sonra kaydedilmesi en temiz yöntemdir.
# 1. Grafiği bir objeye ata
p1 <- ggplot(TGSS, aes(x = degurba)) +
geom_bar(fill="steelblue") +
labs(title = "Kentleşme Düzeyine Göre Dağılım", x = "Kentleşme Düzeyi", y = "Sayı") +
theme_minimal()
# 2. ggsave ile objeyi kaydet
ggsave(filename = "images/kentlesme_grafigi.png",
plot = p1,
dpi = 300,
width = 17,
height = 10,
units = "cm")