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.
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:
x
ve y
(Konum): En temel
estetiktir. Sayısal, kategorik veya zaman verisi olabilir. Grafiğin ana
yapısını oluşturur.color
(Renk - Dış Çizgi/Nokta Rengi):
Genellikle kategorik verileri birbirinden ayırmak için
kullanılır. Farklı gruplara farklı renkler atar.fill
(Dolgu Rengi): Çubuk grafikler,
kutu grafikleri gibi içi doldurulabilen geometrilerde
kategorik verileri ayırmak için kullanılır.size
(Boyut): Genellikle
sayısal bir değişkeni temsil eder. Değer ne kadar
büyükse, nokta veya çizgi de o kadar büyük/kalın olur.shape
(Şekil): Sadece
kategorik değişkenleri temsil edebilir. Farklı gruplara
farklı şekiller (daire, kare, üçgen vb.) atar. ggplot2
genellikle en fazla 6 farklı şekli ayırt etmeyi önerir.alpha
(Şeffaflık): Genellikle
sayısal bir değişkeni temsil eder. Değer ne kadar
büyükse, renk o kadar opak (az şeffaf) olur. Özellikle üst üste binen
noktaları (overplotting) göstermek için çok kullanışlıdır.linetype
(Çizgi Tipi): Çizgi
grafiklerinde, farklı kategorik grupları temsil etmek
için kullanılır (düz, kesikli, noktalı vb.).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:
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.
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.
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…
İş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
Ş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
İş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.
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.
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
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 Anlatmaksize
(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
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ırmakshape
(ş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
İş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.
Ş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.
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!
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/