Merhaba Dostlar, Atölyeye İniyoruz!

Bir önceki bölümde, esquisse sihirbazıyla ggplot2’nin neler yapabildiğine hızlıca bir göz attık. Şimdi, o sihirli perdenin arkasına geçme ve o harika grafikleri kendi ellerimizle, kod yazarak nasıl inşa edeceğimizi öğrenme zamanı.

Bu bölümde, ggplot2’nin kalbi ve ruhu olan estetik (aes) haritalama sanatını öğreneceğiz. Bu, verimizdeki sütunları, grafiğin görsel özelliklerine nasıl atayacağımızı, yani verimizle tuval arasında nasıl bir “köprü” kuracağımızı keşfedeceğimiz yerdir.


Görsel Alfabemiz: Temel Estetikler (aes)

Grafiklerin Grameri felsefesine göre, bir grafiğin en temel amacı, veri setimizdeki değişkenleri, gözümüzün algılayabileceği görsel özelliklere dönüştürmektir. İşte bu görsel özelliklere estetik (aesthetics) diyoruz. ggplot2’de bu dönüştürme işini aes() fonksiyonu içinde yaparız.

En sık kullanacağımız estetikler ve hangi tür veriler için uygun oldukları şunlardır:


Sihrin Arkasındaki Mantık: Grafiklerin Grameri

ggplot2 ile bir grafik oluşturmayı, basit bir cümle kurmaya benzetebiliriz. Her cümlenin nasıl bir öznesi, nesnesi ve yüklemi varsa, her ggplot grafiğinin de üç temel ve vazgeçilmez bileşeni vardır:

  1. data (Veri - Cümlenin Konusu): “Ben hangi malzemeyle çalışacağım?” sorusunun cevabıdır. ggplot() fonksiyonunun ilk argümanı her zaman kullanacağımız veri çerçevesidir.

  2. aes() (Estetik - Cümlenin Yapısı): “Malzemelerimi görsel olarak nasıl haritalayacağım?” sorusunun cevabıdır. aes() içinde, veri setimizdeki sütunları grafiğin görsel özelliklerine (x ekseni, y ekseni, renk, boyut vb.) atarız.

  3. geom_...() (Geometri - Cümlenin Yüklemi): “Bu malzemelerle ne yapacağım?” sorusunun cevabıdır. + işareti ile eklediğimiz bu katman, grafiğin türünü belirler. Örneğin, geom_point() “noktalar çiz”, geom_bar() “çubuklar çiz” anlamına gelir.

Temel Formülümüz:

ggplot(data = <VERİ_SETİ>, mapping = aes(x = <SÜTUN_1>, y = <SÜTUN_2>)) +
  geom_point()

Atölye: İlk ggplot Saçılım Grafiğimizi İnşa Ediyoruz

Bu formülü, R ile birlikte gelen mpg veri setini kullanarak pratiğe dökelim. mpg veri seti, farklı araba modellerinin yakıt tüketimi ve diğer özelliklerini içerir.

Amacımız: Bir arabanın motor hacmi (displ) ile otoyol yakıt verimliliği (hwy) arasındaki ilişkiyi görselleştirmek.

# ggplot2'yi içeren tidyverse paketini çağıralım
library(tidyverse)

# mpg veri setinin yapısına hızlıca bakalım
glimpse(mpg)
## Rows: 234
## Columns: 11
## $ manufacturer <chr> "audi", "audi", "audi", "audi", "audi", "audi", "audi", "…
## $ model        <chr> "a4", "a4", "a4", "a4", "a4", "a4", "a4", "a4 quattro", "…
## $ displ        <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2.0, 2.…
## $ year         <int> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1999, 200…
## $ cyl          <int> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8, 8, …
## $ trans        <chr> "auto(l5)", "manual(m5)", "manual(m6)", "auto(av)", "auto…
## $ drv          <chr> "f", "f", "f", "f", "f", "f", "f", "4", "4", "4", "4", "4…
## $ cty          <int> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17, 17, 1…
## $ hwy          <int> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25, 25, 2…
## $ fl           <chr> "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p…
## $ class        <chr> "compact", "compact", "compact", "compact", "compact", "c…

Adım 1: Boş Tuvali Oluşturma

İşe, ggplot()’a verimizi ve estetik haritalamamızı vererek başlayalım. Bu, bize üzerinde çalışacağımız boş bir tuval ve doğru etiketlenmiş eksenler verecektir.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy))
ggplot2'de Boş Bir Tuval Oluşturma

ggplot2’de Boş Bir Tuval Oluşturma

Adım 2: Geometri Katmanını Ekleme

Şimdi bu boş tuvalin üzerine, verilerimizi temsil edecek olan geometrik şekilleri, yani noktaları ekleyelim. Bunu + operatörü ve geom_point() fonksiyonu ile yaparız.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
  geom_point()
İlk Saçılım Grafiğimiz: Motor Hacmi ve Yakıt Verimliliği

İlk Saçılım Grafiğimiz: Motor Hacmi ve Yakıt Verimliliği

İşte bu kadar! Bu iki satır kodla, motor hacmi arttıkça otoyol yakıt verimliliğinin genellikle düştüğünü gösteren anlamlı bir grafik oluşturduk.

Ustalık Dokunuşu: Grafiğe Yeni Bir Boyut Ekleme

Grafiklerin Grameri’nin asıl gücü, aes() içine yeni estetikler ekleyerek grafiği kolayca zenginleştirebilmemizdir. Bu sayede, grafiğimize üçüncü, dördüncü ve hatta beşinci bir bilgi katmanı ekleyebiliriz.

Renk Estetiği (color)

Grafikteki her bir noktanın renginin, arabanın sınıfına (class) göre değişmesini sağlayalım.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = class)) +
  geom_point()
Üçüncü Bir Değişkeni Renk Estetiği ile Ekleme

Üçüncü Bir Değişkeni Renk Estetiği ile Ekleme

Sadece color = class ekleyerek grafiğe anında yeni bir boyut kattık. Artık farklı araba sınıflarının bu grafikte nasıl kümelendiğini görebiliyoruz.

Grafiğimizi Yorumlayalım:

Bu saçılım grafiği, veriyi görselleştirmenin temel gücünü, yani ham verideki karmaşık ilişkileri ve örüntüleri anlaşılır kılma yeteneğini mükemmel bir şekilde sergilemektedir.

Grafikte, araçların motor hacmi (displ ekseni) ile otoyol yakıt verimliliği (hwy ekseni) arasındaki ilişki incelenmektedir. İlk bakışta, noktaların sol üstten sağ alta doğru genel bir eğilim göstermesi, motor hacmi arttıkça yakıt verimliliğinin düştüğünü açıkça ortaya koymaktadır. Ancak bu grafiğin asıl değeri, üçüncü bir boyutu, yani araç sınıfını (class) renk kodlamasıyla eklemesinde yatar.

Bu sayede genel eğilimin ötesine geçip verinin içindeki belirgin gruplaşmaları görebiliyoruz. Örneğin, ‘subcompact’ (mor) ve ‘compact’ (altın sarısı) araçların sol üst köşede kümelenmesi, onların küçük motorlarla yüksek verimlilik sunduğunu teyit ederken; ‘SUV’ (pembe) ve ‘pickup’ (açık mavi) araçların sağ alt köşedeki yoğunluğu, büyük motorların düşük verimlilikle olan bağını doğrulamaktadır. ‘Midsize’ (yeşil) araçlar ise bu iki uç arasında bir köprü görevi görmektedir.

Dolayısıyla bu görselleştirme, sadece iki sayısal değişken arasındaki bir ilişkiyi göstermekle kalmaz, aynı zamanda kategorik bir değişken yardımıyla verinin nasıl anlamlı segmentlere ayrılabileceğini ve bu segmentlerin genel trend içinde nasıl farklı davranışlar sergilediğini somut bir şekilde kanıtlar. Bu, bir veri tablosuna bakarak çıkarılması oldukça zor olan zengin bir içgörüyü saniyeler içinde sunar.

Renk Estetiği İçin Bir Başka Örnek: Noktaların rengi, arabanın çekiş tipine (drv) göre değişsin. drv kategorik bir değişken olduğu için ggplot2 her bir kategoriye otomatik olarak farklı bir renk atayacaktır.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv)) +
  geom_point()

Grafiğimizi Yorumlayalım:

Bu saçılım grafiği, iki sayısal değişken (motor hacmi ve yakıt verimliliği) arasındaki ilişkiyi incelerken, kategorik bir değişkenin (çekiş türü) bu ilişkiyi nasıl şekillendirdiğini göstermesi açısından güçlü bir örnektir.

Grafiğin genel yapısı, motor hacmi (displ) arttıkça otoyol verimliliğinin (hwy) düştüğünü net bir şekilde ortaya koymaktadır; noktalar soldan sağa doğru alçalan bir patika izler. Ancak bu görselin asıl anlatı gücü, çekiş türünü (drv) temsil eden renkleri devreye soktuğumuzda ortaya çıkar ve bu sayede genel eğilimin altında yatan daha incelikli yapıları keşfedebiliriz.

Önden çekişli (f, yeşil) araçların neredeyse tamamının grafiğin sol üst kısmında, yani küçük motor hacmi ve yüksek verimlilik bölgesinde kümelendiğini görüyoruz. Buna karşılık, dört çeker (4, kırmızı) ve arkadan itişli (r, mavi) araçlar, grafiğin orta ve sağ alt kısımlarında yoğunlaşarak daha büyük motorlar ve daha düşük yakıt verimliliği ile ilişkilendirilmektedir.

Sonuç olarak, bu grafik bize sadece “büyük motorlar çok yakar” demekle kalmaz, aynı zamanda çekiş sisteminin de bu denklemde önemli bir rol oynadığını ve belirli çekiş türlerinin belirli motor hacmi ve verimlilik profilleriyle güçlü bir şekilde bağlantılı olduğunu görsel olarak kanıtlar. Bu, ham veriden kolayca anlaşılamayacak bir hikayeyi etkili bir şekilde özetler.


size ve color Estetikleri: Miktarı ve Grupları Birlikte Anlatmak

size (boyut) ve color (renk) estetikleri, birlikte kullanıldığında bir grafiğe inanılmaz bir derinlik katabilir. Bu estetiklerin gücünü görmek için, R’ın içindeki gapminder veri setini kullanalım (eğer yüklü değilse install.packages("gapminder") ile kurun). Bu veri seti, ülkelerin yıllara göre yaşam beklentisi, kişi başı gelir ve nüfus bilgilerini içerir.

Soru: 2007 yılında, ülkelerin kişi başı gelirleri (gdpPercap) ile yaşam beklentileri (lifeExp) arasındaki ilişkiyi incelerken, noktaların boyutunu ülkelerin nüfusuna (pop), rengini ise ait oldukları kıtaya (continent) göre ayarlayalım.

# Gerekli paketi çağıralım
library(gapminder)

# Sadece 2007 yılı verilerini filtreleyelim
gapminder_2007 <- filter(gapminder, year == 2007)

ggplot(data = gapminder_2007, 
       mapping = aes(x = gdpPercap, y = lifeExp, size = pop, color = continent)) +
  geom_point(alpha = 0.7) + # alpha ile üst üste binen büyük noktalara şeffaflık verelim
  labs( # Başlık ve etiketleri ekleyerek grafiği daha anlaşılır kılalım
    title = "2007 Yilinda Gelir, Yasam Beklentisi ve Nufus Iliskisi",
    x = "Kisi Basina Düsen Gelir (Logaritmik Olçek)",
    y = "Ortalama Yasam Beklentisi (Yil)",
    size = "Nufus",
    color = "Kita"
  ) +
  scale_x_log10() # Gelir dağılımı çok geniş olduğu için x eksenini logaritmik ölçeğe alalım
Boyut ve Renk Estetikleriyle Zenginleştirilmiş Balon Grafiği

Boyut ve Renk Estetikleriyle Zenginleştirilmiş Balon Grafiği

Grafiğimizi Yorumlayalım:

Bu balon grafiği, tek bir görsel üzerinde dört farklı veri boyutunu (kişi başına gelir, yaşam beklentisi, nüfus ve kıta) aynı anda sunarak veri görselleştirmenin ne kadar güçlü bir hikaye anlatma aracı olabileceğini gösteren klasik bir örnektir.

Grafiğin temel iskeletini, x eksenindeki kişi başına düşen gelir ile y eksenindeki ortalama yaşam beklentisi arasındaki ilişki oluşturur. Gözle görülen en net örüntü, gelir seviyesi arttıkça yaşam beklentisinin de artma eğiliminde olmasıdır; noktalar sol alttan sağ üste doğru bir yay çizer. Ancak bu grafiği zenginleştiren asıl unsurlar, renk ve boyut estetikleridir.

Balonların rengi, her bir noktanın hangi kıtaya ait olduğunu göstererek coğrafi gruplaşmaları anında ortaya koyar. Örneğin, Afrika ülkelerinin (kırmızı) düşük gelir ve düşük yaşam beklentisi bölgesinde, Avrupa ülkelerinin (mavi) ise yüksek gelir ve yüksek yaşam beklentisi bölgesinde kümelendiğini açıkça görebiliriz. Buna ek olarak, her bir balonun boyutu o ülkenin nüfusunu temsil eder. Bu sayede, Asya kıtasını (yeşil) temsil eden iki dev balonun (Çin ve Hindistan) dünya nüfusunun ne kadar büyük bir kısmını oluşturduğunu ve bu ülkelerin gelir-yaşam beklentisi ekseninde nerede konumlandığını tek bakışta anlayabiliriz.

Sonuç olarak bu grafik, sadece bir dizi sayıyı görselleştirmekle kalmaz, 2007 yılındaki küresel sağlık ve refah dağılımına dair karmaşık ve çok katmanlı bir öyküyü, ham veriden çıkarılması çok zor olan içgörüleri sezgisel olarak anlaşılır bir biçimde sunar.


shape Estetiği: Grupları Şekillerle Ayırmak

shape (şekil) estetiği, az sayıda kategoriye sahip bir değişkeni, renk kullanmadan veya renge ek olarak ayırt etmek için çok kullanışlıdır.

Soru: mpg veri setine geri dönelim. Motor hacmi (displ) ve yakıt verimliliği (hwy) ilişkisini incelerken, arabaları çekiş tipine (drv) göre farklı şekillerle gösterelim.

ggplot(data = mpg, mapping = aes(x = displ, y = hwy, shape = drv)) +
  geom_point() +
  labs(
    title = "Motor Hacmi ve Yakit Verimliligi",
    subtitle = "Cekis Tipine Gore Ayrilmis",
    x = "Motor Hacmi (Litre)",
    y = "Otoyol Yakit Verimliligi (MPG)",
    shape = "Cekis Tipi"
  )

Gördüğünüz gibi, shape estetiği 3 farklı çekiş tipini (4, f, r) daire, üçgen ve kare olarak net bir şekilde ayırdı. Bu, renkli çıktı alamayacağınız durumlar (örneğin, siyah-beyaz bir makale) için hayat kurtarıcıdır.

“İyi ama ben hem şekiller farklı olsun hem de hayatıma biraz renk katmak istiyorum!” dediğinizi duyar gibiyim. ggplot2 atölyesinde istekler sınır tanımaz! Elbette, birden fazla estetiği aynı anda kullanarak tuvalimizi bir renk cümbüşüne çevirebiliriz.

Haydi, hem çekiş tipine (drv) göre şekilleri hem de araba sınıfına (class) göre renkleri aynı anda haritalayalım:

ggplot(data = mpg, mapping = aes(x = displ, y = hwy, shape = drv, color = class)) +
  geom_point() +
  labs(
    title = "Motor Hacmi ve Yakit Verimliligi",
    subtitle = "Cekis Tipi ve Arac Sinifina Gore Ayrilmis",
    x = "Motor Hacmi (Litre)",
    y = "Otoyol Yakıt Verimliligi (MPG)",
    shape = "Cekis Tipi",
    color = "Arac Sinifi"
  )
Hem Şekil Hem Renk Estetiği: Görsel Zenginlik

Hem Şekil Hem Renk Estetiği: Görsel Zenginlik

İşte bu! Artık grafiğimiz 4 farklı değişkenin (displ, hwy, drv, class) ilişkisini tek bir tuvalde anlatıyor. Bu, Grafiklerin Grameri’nin bize sunduğu o inanılmaz esnekliğin en güzel örneklerinden biridir.


Ustalık Tartışması: Her Estetik, Aynı Hikayeyi mi Anlatmalı?

Şimdiye kadar, farklı estetikleri (color, size, shape) farklı değişkenlere atayarak grafiklerimizi zenginleştirdik. Peki, bir ustanın aklına şu can alıcı soru gelir:

“Aynı değişkeni, hem renk hem de şekil estetiğine aynı anda atamak iyi bir fikir midir?”

Örneğin, aşağıdaki kodu düşünelim:

ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv, shape = drv)) +
  geom_point() +
  labs(title = "Estetik Tekrari: Iyi mi, Kotu mu?")

Bu grafikte, çekiş tipini (drv) hem renklerle (kırmızı, yeşil, mavi) hem de şekillerle (daire, üçgen, kare) temsil ettik.

Bu Yaklaşım Uygun mudur?

Bu sorunun cevabı, veri görselleştirmenin temel felsefesinde yatar: Amacımız nedir?

Ustanın Kararı:

Claus Wilke’nin de vurguladığı gibi, burada sihirli bir kural yoktur. Karar, tamamen sizin amacınıza ve hedef kitlenize bağlıdır.

Eğer önceliğiniz, mesajınızın her koşulda (renk körlüğü, siyah-beyaz baskı vb.) ve şüpheye yer bırakmayacak şekilde net olarak anlaşılması ise, aynı değişkeni hem renk hem de şekil ile kodlamak harika ve düşünceli bir yaklaşımdır.

Eğer grafiğiniz zaten çok sade ise ve amacınız sadece hızlı bir görsel keşif yapmaksa, tek bir estetik (genellikle color) yeterli olacaktır.

Unutmayın dostlar, iyi bir veri görselleştirmesi, sadece doğru komutları yazmak değil, aynı zamanda bu tür bilinçli tasarım kararları vermektir.


Bölümün Özeti ve Bir Sonraki Adım

Dostlar, tebrikler! Bu bölümde ggplot2’nin kalbi olan aes() fonksiyonunu ve estetiklerin gücünü keşfettik. Verimizdeki farklı değişkenleri konum, renk, boyut ve şekil gibi görsel özelliklere nasıl atayacağımızı öğrendik.

Bu bölümde noktalarla (geom_point) hikayeler anlattık. Peki ya verimizi çubuklarla, çizgilerle veya kutularla göstermek isteseydik?

Bir sonraki bölümde, ggplot2 atölyesindeki diğer temel aletleri, yani geom_bar, geom_line ve geom_boxplot’u tanıyarak, her türlü veriye uygun grafiği nasıl oluşturacağımızı keşfedeceğiz. Atölyenin diğer makinelerini çalıştırmaya hazır olun!

Yararlandığımız Kaynaklar

Bu bölümde işlenen “estetikler” konusunun felsefesi ve hangi estetiğin hangi veri tipi için uygun olduğuna dair yaklaşımlar, aşağıdaki değerli eserlerden ilham alınarak oluşturulmuştur.

Wilke, C. O. (2019). Fundamentals of Data Visualization. O’Reilly Media. https://clauswilke.com/dataviz/

Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis. Springer. https://ggplot2-book.org/