Merhaba dostlar!
Önceki bölümlerde ggplot2
ile birbirinden anlamlı
grafikler oluşturmayı öğrendik. Ancak bu grafikler genellikle tek
başlarına duruyorlardı. Peki ya bir rapor hazırlarken, birden fazla
grafiği tek bir tuvalde, anlamlı bir bütünlük içinde sunmak
isteseydik?
Bu bölümde tam olarak bu ihtiyaca çözüm bulacağız ve R’da bunu yapmanın farklı yollarını keşfederek neden modern yaklaşımın genellikle daha güçlü olduğunu anlayacağız.
# Gerekli kütüphanelerimizi çağıralım
library(tidyverse) # ggplot2, dplyr ve diğerleri için
library(patchwork) # Grafikleri birleştirme sihirbazımız
# Serimiz boyunca tutarlı ve temiz bir görünüm için varsayılana ayarlayalım
theme_set(theme_light())
Hadi bir senaryo ile başlayalım: Elimizdeki mpg
veri
setinde bulunan tüm sayısal değişkenlerin dağılımını
(histogramlarını) hızlıca görmek istiyoruz. Amacımız, veri setinin genel
bir panoramasını çekmek.
Bu grafikleri tek tek çizmek yerine, hepsini tek bir tuvalde nasıl sergileyebiliriz? İşte bu bölümün ana sorusu bu.
İlk akla gelen yöntem, bir for
döngüsü kullanarak her
bir sayısal değişken için bir ggplot
grafiği oluşturup
print()
fonksiyonu ile ekrana bastırmak olabilir.
# eval=FALSE çünkü bu kod Rmd dosyasını çok sayıda grafikle doldurur.
# Sadece mantığı göstermek için R konsolunda denenebilir.
# Sayısal değişkenlerin isimlerini alalım
numeric_vars <- mpg %>% select_if(is.numeric) %>% names()
# Her değişken için bir ggplot histogramı çiz ve ekrana bas
for (var in numeric_vars) {
p <- ggplot(mpg, aes_string(x = var)) +
geom_histogram(fill = "steelblue", color = "white", bins = 20) +
labs(title = paste("Dağılım:", var))
print(p) # Grafiği ekrana çizdir
}
Bu kodu R konsolunda çalıştırırsanız, RStudio’nun “Plots” panelinde grafiklerin birbiri ardına çizildiğini görürsünüz. Ancak onları sadece ileri-geri oklarıyla gezebilirsiniz. Bu yöntem, grafikleri bir araya getirip tek bir bütün olarak sunmaz. Bu bir “sergi” değil, sadece peş peşe bir “slayt gösterisi” gibidir. Kontrol bizde değildir ve bir rapor için kesinlikle kullanışsızdır.
Gördüğümüz gibi, bu yöntem bize tek bir bütünleşik çıktı vermiyor. Bize, grafikleri tek bir tuvalde düzenleyecek bir yöntem lazım. Gelin R’da bunu yapmanın yollarını inceleyelim.
R’ın temel (“Base R”) fonksiyonlarını kullanarak bu problemi
çözebiliriz. par(mfrow = ...)
fonksiyonu, çizim alanını
belirli bir satır ve sütun sayısına bölmemizi sağlar. Ardından bir
for
döngüsü içinde Base R’ın hist()
fonksiyonunu kullanarak her bir değişken için histogram çizebiliriz.
Bu yöntem işe yarar, ancak bir veri kaşifinin işi sadece çalışan kod yazmak değil, aynı zamanda bulgularını en anlaşılır ve profesyonel şekilde sunmaktır. Bu da genellikle grafiklerdeki etiketleri kendi dilimize çevirmeyi gerektirir.
Grafiklerimizi Türkçeleştirmek için kodun içinde
if (var == "displ") { etiket <- "Motor Hacmi" }
gibi tek
tek kontrol blokları yazmak hem yorucu, hem de hataya açık bir
yöntemdir.
Bunun yerine, daha zarif ve ölçeklenebilir bir strateji izleyeceğiz: Değişken isimlerinin İngilizce ve Türkçe karşılıklarını içeren bir “sözlük” oluşturacağız. R’da bunu yapmanın en kolay yolu, isimlendirilmiş bir vektör (named vector) kullanmaktır.
Bu yaklaşım, hem kodumuzu temiz tutar hem de gelecekte yeni çeviriler eklemeyi çok kolaylaştırır. Şimdi, sonraki adımlarda kullanacağımız bu sözlüğü oluşturalım.
# --- GRAFİKLERİ TÜRKÇELEŞTİRMEK İÇİN SÖZLÜK ---
# Bu, kodumuzda esneklik sağlar.
# Vektörün "isimleri" (names) orijinal değişken adları,
# "değerleri" ise bizim istediğimiz Türkçe karşılıklarıdır.
# R, bu yapı sayesinde ceviri_sozlugu["displ"] dediğimizde bize "Motor Hacmi"ni verir.
ceviri_sozlugu <- c(
"displ" = "Motor Hacmi",
"year" = "Model Yili",
"cyl" = "Silindir Sayisi",
"cty" = "Sehir Ici Tuketim (MPG)",
"hwy" = "Otoyol Tuketimi (MPG)"
)
Şimdi, oluşturduğumuz bu ‘sözlüğü’ kullanarak hem klasik hem de modern yöntemle üreteceğimiz grafikleri nasıl Türkçeleştireceğimize bakalım.
# Az önce oluşturduğumuz 'ceviri_sozlugu'nü burada kullanacağız.
# 1. Sadece sayısal değişkenlerin isimlerini alalım
numeric_vars_indices <- sapply(mpg, is.numeric)
numeric_var_names <- names(mpg)[numeric_vars_indices]
# 2. Grafik düzenini ayarlayalım
old_par <- par(mfrow = c(2, 3))
# 3. Her sayısal değişken için bir histogram çizelim
for (var in numeric_var_names) {
# Sözlükten Türkçe karşılığı alalım.
# Eğer sözlükte o değişken için bir çeviri yoksa, orijinal ismi kullanır.
turkce_isim <- ceviri_sozlugu[var]
if (is.na(turkce_isim)) {
turkce_isim <- var
}
hist(mpg[[var]],
main = paste(turkce_isim, "Dagilimi"),
xlab = turkce_isim,
ylab = "Frekans",
col = "lightgreen",
border = "gray")
}
# 4. Grafik ayarlarını varsayılana geri döndürelim
par(old_par)
Gördüğünüz gibi, bu yöntem hem çalışıyor hem de oluşturduğumuz ‘sözlük’ sayesinde etiketlerimiz artık tamamen Türkçe ve anlaşılır. Bu, hızlı bir ön inceleme için oldukça pratiktir. Peki madem bu çalışıyor, neden yeni bir şeye ihtiyacımız var? Çünkü bu “iyi” bir çözüm olsa da, “daha iyisi” var.
Ustalık Notu: Klasik Yöntemin Sınırları
- Estetik Esneklik: Bu grafiklerin görünümünü özelleştirmek (
ggplot
’taki gibi temalar eklemek, renkleri başka bir değişkene göre ayarlamak) çok daha zahmetlidir.- “Çiz ve Unut” Mantığı: Bu grafikler çizildiği anda “tuvale basılır” ve bir nesne olarak saklanmaz. Yani sonradan bir grafiği alıp başka bir grafikle farklı bir düzende birleştiremezsiniz.
- Modern İş Akışından Kopukluk: Serimiz boyunca
tidyverse
veggplot2
’nin sunduğu modern, tutarlı ve veri-çerçevesi-merkezli iş akışını benimsedik. Base R’ın grafik sistemi bu akışın dışında kalır.
İşte bu sınırlamalar, bizi daha esnek ve güçlü olan modern çözüme yönlendiriyor.
ggplot2
+ patchwork
)”Modern yaklaşım, iki güçlü aracın birleşimine dayanır:
ggplot2
: Her bir grafiği esnek ve
özelleştirilebilir birer “nesne” olarak oluşturmak için.patchwork
: Bu ggplot
nesnelerini inanılmaz bir kolaylıkla bir araya getirmek için.Tıpkı yukarıda yaptığımız gibi, “çeviri sözlüğümüzü” kullanarak
ggplot2
ile oluşturduğumuz grafikleri de tamamen
Türkçeleştireceğiz.
wrap_plots()
)Klasik yöntemde for
döngüsü ile yaptığımız işin modern
karşılığı, ggplot
nesnelerini bir listede toplayıp
wrap_plots()
fonksiyonuna vermektir.
# 1. Grafik nesnelerini saklamak için boş bir liste oluşturalım
plot_list <- list()
# 2. 'for' döngüsü ile her değişken için bir ggplot nesnesi oluşturup listeye ekleyelim
for (var in numeric_var_names) {
# Sözlükten Türkçe karşılığı alıyoruz
turkce_isim <- ceviri_sozlugu[var]
if (is.na(turkce_isim)) {
turkce_isim <- var
}
p <- ggplot(mpg, aes_string(x = var)) +
geom_histogram(bins = 15, fill = "skyblue", color = "white") +
labs(
title = turkce_isim, # Başlık olarak Türkçe ismi kullan
x = turkce_isim, # X ekseni için Türkçe ismi kullanıyoruz
y = "Frekans" # Y ekseni için Türkçe etiket
)
plot_list[[var]] <- p
}
# 3. wrap_plots() ile grafikleri birleştirelim
wrap_plots(plot_list, ncol = 3)
Base R yöntemiyle neredeyse aynı görseli elde ettik, ancak çok önemli
bir farkla: Artık her bir grafiğimiz (plot_list
içindeki
p
’ler) hala yaşayan, üzerinde değişiklik yapabileceğimiz,
kaydedebileceğimiz veya başka düzenlerde kullanabileceğimiz birer R
nesnesi!
Ustalık Notu: Görsel Tekrar ve Minimalist Tasarım
Harika bir iş çıkardık ve az önceki kodumuzla her grafiğin x eksenine kendi kimliğini verdik. Bu, genellikle en doğru ve en bilgilendirici yaklaşımdır. Ancak bir veri kaşifi olarak alet çantanızda farklı tasarım felsefelerinin de olması gerekir.
Bir an düşünün: Grafiğin başlığında zaten “Motor Hacmi” yazıyorsa, x ekseninde tekrar “Motor Hacmi” yazmak gerçekten gerekli mi? Bu tür durumlarda, görsel bir “tekrar” oluşur. Daha temiz, daha minimalist bir görünüm elde etmek ve okuyucunun doğrudan veriye odaklanmasını sağlamak için bazen bu tekrarı ortadan kaldırmak isteyebiliriz.
İşte bu noktada
labs()
fonksiyonunun bir başka gücü devreye giriyor: Bir etiketiNULL
olarak ayarlayarak onu tamamen kaldırabiliriz.# ...döngünün içindeki labs() fonksiyonunu şu şekilde düzenleyebiliriz... labs( title = turkce_isim, # Başlık zaten değişkeni belirtiyor x = NULL, # x ekseni etiketini tamamen kaldırır y = "Frekans" )
Peki, hangisi “doğru”? İkisi de! Bu tamamen sizin tasarım tercihinize ve anlatmak istediğiniz hikayeye bağlı. Eğer her bilginin en açık şekilde yer almasını istiyorsanız, eksen etiketini kullanın. Eğer daha sade ve modern bir sunum hedefliyorsanız, etiketi kaldırarak grafiğin “nefes almasını” sağlayabilirsiniz. Unutmayın, siz bu veri sergisinin küratörüsünüz!
+
ve /
ile
İnteraktif Düzenleme)patchwork
’ün asıl devrimci yönü, farklı türdeki
ggplot
nesnelerini birleştirmenin çocuk oyuncağı olmasıdır.
Şimdi bu esnekliği, grafiklerimizin her bir noktasını (başlıklar,
eksenler, lejant başlığı ve hatta lejantın içindeki etiketler) tamamen
kendi dilimize çevirerek birleştirelim ve ustalığımızı sergileyelim.
# --- 1. ADIM: GENEL ÇEVİRİ SÖZLÜĞÜMÜZ ---
# Eksen ve lejant başlıkları için kullanacağımız sözlük.
ceviri_sozlugu_genisletilmis <- c(
"displ" = "Motor Hacmi",
"hwy" = "Otoyol Tuketimi (MPG)",
"class" = "Arac Sinifi",
"manufacturer" = "Uretici Firma"
)
# --- 2. ADIM: LEJANT İÇERİĞİ İÇİN ÖZEL SÖZLÜK ---
# `class` değişkeninin içindeki her bir değer için Türkçe karşılık.
# Bu, sadece lejantın *içindeki* etiketleri değiştirmek için kullanılacak.
sinif_ceviri_sozlugu <- c(
"compact" = "Kompakt",
"midsize" = "Orta Boy",
"suv" = "SUV",
"2seater" = "2 Koltuklu Spor",
"minivan" = "Minivan",
"pickup" = "Kamyonet",
"subcompact" = "Kucuk Boy"
)
# --- 3. ADIM: GRAFİKLERİ OLUŞTURMA ---
# Grafik 1: Tamamen Türkçeleştirilmiş Saçılım Grafiği
p_scatter_tamamen_turkce <- ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(aes(color = class)) +
# Başlıkları, altyazıyı ve eksen etiketlerini `labs()` ile ayarlıyoruz.
# Lejant başlığını da `color = ...` diyerek burada belirtiyoruz.
labs(
title = "Motor Hacmi ve Yakit Tuketimi Iliskisi",
subtitle = "Arac Sinifina Gore Renklendirilmistir",
x = ceviri_sozlugu_genisletilmis["displ"],
y = ceviri_sozlugu_genisletilmis["hwy"],
color = ceviri_sozlugu_genisletilmis["class"]
) +
# YENİ KATMAN: İşte sihir burada!
# `scale_color_discrete` ile lejantın İÇERİĞİNİ değiştiriyoruz.
scale_color_discrete(labels = sinif_ceviri_sozlugu)
# Grafik 2: Tamamen Türkçeleştirilmiş Bar Grafiği
p_bar_turkce <- ggplot(mpg, aes(y = manufacturer)) +
geom_bar(fill = "steelblue") +
labs(
title = "Ureticilere Gore Arac Dagilimi",
y = ceviri_sozlugu_genisletilmis["manufacturer"],
x = "Arac Sayisi"
)
# --- 4. ADIM: TAM KONTROL SAHİBİ OLDUĞUMUZ GRAFİKLERİ BİRLEŞTİRME ---
p_scatter_tamamen_turkce + p_bar_turkce
patchwork
’ün asıl devrimci yönü, bu ggplot
nesnelerini inanılmaz bir kolaylıkla bir araya getirmektir. Örneğin, az
önce oluşturduğumuz o tamamen Türkçeleştirilmiş iki farklı grafiği
(p_scatter_tamamen_turkce
ve p_bar_turkce
) yan
yana koyup, bu ikilinin altına da daha önce oluşturduğumuz histogram
listesinden bir grafiği (plot_list
içindeki “Motor Hacmi”
grafiği) ekleyebiliriz.
Bu tür karmaşık ve iç içe düzenler oluşturmak,
par(mfrow)
’un basit grid yapısıyla neredeyse imkansızdır.
Gelin bu gücü canlı olarak görelim:
# Karmaşık bir düzen oluşturalım:
# Üst sırada: Saçılım grafiği + Bar grafiği
# Alt sırada: Histogram listemizden "Motor Hacmi" grafiği
# Gerekli nesnelerimiz zaten önceki kod bloklarında oluşturulmuştu.
# Sadece onları bir araya getiriyoruz.
ust_sira <- p_scatter_tamamen_turkce + p_bar_turkce
alt_sira <- plot_list[["displ"]] # "displ" (Motor Hacmi) histogramını seçiyoruz
# Şimdi bu iki sırayı `/` operatörü ile alt alta koyalım
ust_sira / alt_sira
İşte patchwork
’ün büyüsü budur!
Serimizin felsefesi olan “ustalığa” giden yolda, ggplot2
ve
patchwork
ikilisi, veri hikayelerinizi anlatırken size
sınırsız bir yaratıcılık ve kontrol imkanı verecektir.
Bravo dostlar! Bu bölümde, tekil sanat eserleri gibi duran grafiklerimizi alıp onları profesyonel bir sergiye dönüştürme sanatını öğrendik. Birden çok grafiği bir araya getirme problemini çözmek için çıktığımız bu yolda, üç farklı yaklaşımı karşılaştırdık ve her birinden önemli dersler çıkardık:
Slayt Gösterisi Yöntemi (print
+
for
): Bir rapor için çözüm olmadığını, sadece peş
peşe bir gösterim olduğunu anladık.
Klasik Yöntem (par
+
hist
): Hızlı ve çalışan bir çözüm
olduğunu gördük. Hatta bir “çeviri sözlüğü” tekniğiyle etiketlerini
nasıl Türkçeleştireceğimizi bile öğrendik. Ancak
"çiz ve unut"
mantığı ve modern ggplot
akışıyla uyumsuzluğu gibi önemli sınırları olduğunu da fark
ettik.
Modern Yöntem (ggplot
+
patchwork
): “İyinin daha iyisi” olan bu yaklaşımın
neden “altın standart” olduğunu kanıtladık. Bu yöntem bize sadece
nesne tabanlı ve düzenleme konusunda
esnek bir çözüm sunmakla kalmadı, aynı zamanda bir grafiğin her
bir zerresini kontrol etme gücü verdi:
labs()
ile başlıkları ve eksenleri,scale_*()
fonksiyon ailesi ile lejant başlıklarından
içindeki en küçük etiketlere kadar her detayı,+
ile /
operatörleriyle en karmaşık
sergi düzenlerini bile kolayca oluşturmayı öğrendik.Serimizin felsefesi olan “ustalığa” giden yolda, ggplot2
ve patchwork
ikilisi, veri hikayelerinizi anlatırken size
sınırsız bir yaratıcılık ve kontrol imkanı verecektir.
Peki, bu kazandığımız yeni süper güçleri nerede kullanacağız? Veri Görselleştirme Sanatı’nın temellerini ve ustalık dokunuşlarını öğrendiğimize göre, artık vites yükseltme zamanı geldi!
Bir sonraki durağımız, iki aşamadan oluşacak olan Bölüm 5: Uygulama ve Hız Kazanma olacak.
İlk olarak, Mini-Bölüm 5.1: Bir Veri Kaşifinin Günlüğü -
Sigorta Masrafları EDA Projesi ile sahaya ineceğiz. Bu bölümde,
yaş, sigara kullanımı veya yaşanılan bölge gibi faktörlerin bir kişinin
sağlık sigortası maliyetlerini nasıl etkilediğini araştıracağız. Şu ana
kadar öğrendiğimiz dplyr
, ggplot2
ve
patchwork
yeteneklerimizi kullanarak baştan sona gerçek bir
Keşifsel Veri Analizi projesi gerçekleştireceğiz. Teoriyi pratiğe
dökeceğimiz bu macera, öğrendiklerimizin bir araya geldiğinde ne kadar
güçlü olduğunu bize kanıtlayacak.
Hemen ardından, Mini-Bölüm 5.2: Veri Kaşifinin Pusulası -
Otomatik EDA Paketleri bölümünde işleri bir üst vitese
takacağız. Projeyi “elle” yapmanın ardındaki mantığı anladıktan sonra,
DataExplorer
, summarytools
ve
SmartEDA
gibi güçlü paketler sayesinde tüm bu keşif
sürecini tek bir komutla nasıl otomatize edebileceğimizi ve
projelerimize başlarken nasıl inanılmaz bir hız kazanabileceğimizi
göreceğiz.
Hazır olun, çünkü alet çantamızı doldurduk ve şimdi gerçek keşiflere başlıyoruz. Lütfen veriyle kalın, takipte kalın dostlar!