9  Katmanlar

9.1 Giriş

Bölüm 1 bölümünde, yalnızca saçılım grafikleri, çubuk grafikler ve kutu grafikleri yapmaktan çok daha fazlasını öğrendiniz. ggplot2 ile herhangi bir grafik türü yapmak için kullanabileceğiniz bir temel öğrendiniz.

Bu bölümde katmanlı grafik gramerini öğrenerek bu temeli genişleteceksiniz. Estetik eşlemeleri, geometrik nesneleri ve panelleri daha ayrıntılı inceleyerek başlayacağız. Ardından ggplot2’nin grafik oluştururken arka planda gerçekleştirdiği istatistiksel dönüşümleri öğreneceksiniz. Bu dönüşümler, bir çubuk grafikteki çubukların yükseklikleri veya bir kutu grafikteki medyanlar gibi, çizilecek yeni değerleri hesaplamak için kullanılır. Ayrıca, geom’ların grafiklerinizde nasıl gösterildiğini değiştiren konum ayarlamaları hakkında da bilgi edineceksiniz. Son olarak, koordinat sistemlerini kısaca tanıtacağız.

Her katmana ilişkin bütün fonksiyonları ve seçenekleri ele almayacağız. Bunun yerine ggplot2’nin en önemli ve yaygın özelliklerini adım adım gösterecek, ayrıca ggplot2’yi genişleten paketleri tanıtacağız.

9.1.1 Ön koşullar

Bu bölüm ggplot2’ye odaklanır. Bu bölümde kullanılan veri kümelerine, yardım sayfalarına ve fonksiyonlara erişmek için, şu kodu çalıştırarak tidyverse’i yükleyin:

9.2 Estetik eşlemeler

“Bir resmin en büyük değeri, bizi asla beklemediğimiz bir şeyi fark etmeye zorladığı andır.” — John Tukey

ggplot2 paketiyle birlikte gelen mpg veri çerçevesinin, 38 araç modeline ait 234 gözlem içerdiğini hatırlayın.

mpg
#> # A tibble: 234 × 11
#>   manufacturer model displ  year   cyl trans      drv     cty   hwy fl   
#>   <chr>        <chr> <dbl> <int> <int> <chr>      <chr> <int> <int> <chr>
#> 1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p    
#> 2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p    
#> 3 audi         a4      2    2008     4 manual(m6) f        20    31 p    
#> 4 audi         a4      2    2008     4 auto(av)   f        21    30 p    
#> 5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p    
#> 6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p    
#> # ℹ 228 more rows
#> # ℹ 1 more variable: class <chr>

mpg’deki değişkenlerden bazıları şunlardır:

  1. displ: Aracın motor hacmi, litre cinsinden. Sayısal bir değişken.

  2. hwy: Aracın otoyoldaki yakıt verimliliği, galon başına mil (mpg) cinsinden. Aynı mesafeyi kat ederken, düşük yakıt verimliliğine sahip bir araç, yüksek yakıt verimliliğine sahip bir araçtan daha fazla yakıt tüketir. Sayısal bir değişken.

  3. class: Araç türü. Kategorik bir değişken.

Çeşitli araç class’ları için displ ile hwy arasındaki ilişkiyi görselleştirerek başlayalım. Bunu, sayısal değişkenleri x ve y estetiklerine; kategorik değişkeni ise color veya shape gibi bir estetiğe eşleyen saçılım grafiğiyle yapabiliriz.

# Sol
ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
  geom_point()

# Sağ
ggplot(mpg, aes(x = displ, y = hwy, shape = class)) +
  geom_point()
#> Warning: The shape palette can deal with a maximum of 6 discrete values because more
#> than 6 becomes difficult to discriminate
#> ℹ you have requested 7 values. Consider specifying shapes manually if you
#>   need that many of them.
#> Warning: Removed 62 rows containing missing values or values outside the scale range
#> (`geom_point()`).

Yan yana iki saçılım grafiği; ikisi de araçların otoyol yakıt verimliliğine karşı motor hacmini görselleştiriyor ve negatif bir ilişki gösteriyor. Soldaki grafikte class, color estetiğine eşlenmiş, bu da her sınıf için farklı renklerle sonuçlanmış. Sağdaki grafikte class, shape estetiğine eşlenmiş, bu da suv hariç her sınıf için farklı çizim karakteri şekilleriyle sonuçlanmış. Her grafikte, color veya shape ile class değişkeninin düzeyleri arasındaki eşlemeyi gösteren bir gösterge var.

Yan yana iki saçılım grafiği; ikisi de araçların otoyol yakıt verimliliğine karşı motor hacmini görselleştiriyor ve negatif bir ilişki gösteriyor. Soldaki grafikte class, color estetiğine eşlenmiş, bu da her sınıf için farklı renklerle sonuçlanmış. Sağdaki grafikte class, shape estetiğine eşlenmiş, bu da suv hariç her sınıf için farklı çizim karakteri şekilleriyle sonuçlanmış. Her grafikte, color veya shape ile class değişkeninin düzeyleri arasındaki eşlemeyi gösteren bir gösterge var.

class, shape’e eşlendiğinde, iki uyarı alırız:

1: The shape palette can deal with a maximum of 6 discrete values because more than 6 becomes difficult to discriminate; you have 7. Consider specifying shapes manually if you must have them.

2: Removed 62 rows containing missing values (geom_point()).

ggplot2 varsayılan olarak aynı anda yalnızca altı şekil kullanabildiğinden shape estetiğine eşlenen ek gruplar çizilmez. İkinci uyarı bununla ilgilidir – veri kümesinde 62 SUV var ve bunlar çizilmiyor.

Benzer şekilde, class’ı sırasıyla noktaların boyutunu ve saydamlığını kontrol eden size veya alpha estetiklerine de eşleyebiliriz.

# Sol
ggplot(mpg, aes(x = displ, y = hwy, size = class)) +
  geom_point()
#> Warning: Using size for a discrete variable is not advised.

# Sağ
ggplot(mpg, aes(x = displ, y = hwy, alpha = class)) +
  geom_point()
#> Warning: Using alpha for a discrete variable is not advised.

Yan yana iki saçılım grafiği; ikisi de araçların otoyol yakıt verimliliğine karşı motor hacmini görselleştiriyor ve negatif bir ilişki gösteriyor. Soldaki grafikte class, size estetiğine eşlenmiş, bu da her sınıf için farklı boyutlarla sonuçlanmış. Sağdaki grafikte class, alpha estetiğine eşlenmiş, bu da her sınıf için farklı alpha (saydamlık) düzeyleriyle sonuçlanmış. Her grafikte, size veya alpha düzeyi ile class değişkeninin düzeyleri arasındaki eşlemeyi gösteren bir gösterge var.

Yan yana iki saçılım grafiği; ikisi de araçların otoyol yakıt verimliliğine karşı motor hacmini görselleştiriyor ve negatif bir ilişki gösteriyor. Soldaki grafikte class, size estetiğine eşlenmiş, bu da her sınıf için farklı boyutlarla sonuçlanmış. Sağdaki grafikte class, alpha estetiğine eşlenmiş, bu da her sınıf için farklı alpha (saydamlık) düzeyleriyle sonuçlanmış. Her grafikte, size veya alpha düzeyi ile class değişkeninin düzeyleri arasındaki eşlemeyi gösteren bir gösterge var.

Bunların ikisi de uyarı üretir:

Using alpha for a discrete variable is not advised.

Sırasız kesikli (kategorik) bir değişkeni (class) sıralı bir estetiğe (size veya alpha) eşlemek genellikle iyi bir fikir değildir; çünkü aslında var olmayan bir sıralamayı ima eder.

Bir estetiği eşledikten sonra gerisini ggplot2 halleder. Estetiğe uygun bir ölçek seçer ve düzeylerle değerler arasındaki eşlemeyi açıklayan bir gösterge oluşturur. ggplot2, x ve y estetikleri için gösterge yerine eksen çizgisi, işaretler ve etiket oluşturur. Eksen, göstergeyle aynı bilgiyi sağlar: Konumlarla değerler arasındaki eşlemeyi açıklar.

Görünümü belirlemek için bir değişken eşlemesine güvenmek yerine, geom’unuzun görsel özelliklerini geom fonksiyonunuzun bir argümanı olarak (aes()’in dışında) elle de ayarlayabilirsiniz. Örneğin, grafiğimizdeki tüm noktaları mavi yapabiliriz:

ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point(color = "blue")

Araçların otoyol yakıt verimliliğine karşı motor hacminin, negatif bir ilişki gösteren bir saçılım grafiği. Tüm noktalar mavi.

Burada renk, bir değişken hakkında bilgi taşımaz, yalnızca grafiğin görünümünü değiştirir. O estetik için mantıklı bir değer seçmeniz gerekir:

  • Bir karakter dizisi olarak bir rengin adı, örneğin, color = "blue"
  • Milimetre cinsinden bir noktanın boyutu, örneğin, size = 1
  • Şekil 9.1’te gösterildiği gibi, bir sayı olarak bir noktanın şekli, örneğin, shape = 1.
Şekiller ile bunları temsil eden sayılar arasındaki eşleme: 0 - içi boş kare, 1 - içi boş daire, 2 - içi boş üçgen, 3 - artı, 4 - çarpı, 5 - içi boş baklava, 6 - içi boş aşağı üçgen, 7 - çarpılı kare, 8 - yıldız işareti, 9 - artılı baklava, 10 - artılı daire, 11 - yıldız, 12 - artılı kare, 13 - çarpılı daire, 14 - üçgenli kare, 15 - kare, 16 - küçük daire, 17 - üçgen, 18 - baklava, 19 - daire, 20 - nokta, 21 - dolu daire, 22 - dolu kare, 23 - dolu baklava, 24 - dolu üçgen, 25 - dolu aşağı üçgen.
Şekil 9.1: R’da sayılarla tanımlanan 26 yerleşik şekil vardır. Bazı görünüşte tekrar edenler vardır: örneğin, 0, 15 ve 22’nin hepsi karedir. Fark, color ve fill estetiklerinin etkileşiminden gelir. İçi boş şekillerin (0–14) sınırı color tarafından belirlenir; dolu şekiller (15–20) color ile doldurulur; dolgulu şekillerin (21–25) sınırı colordur ve fill ile doldurulurlar. Şekiller, benzer şekilleri birbirine yakın tutacak şekilde düzenlenmiştir.

Şimdiye kadar, bir nokta geom’u kullanırken bir saçılım grafiğinde eşleyebileceğimiz veya ayarlayabileceğimiz estetikleri tartıştık. Olası estetik eşlemeler hakkında daha fazla bilgiyi estetik özellikler vinyetinde bulabilirsiniz.

Bir grafik için kullanabileceğiniz belirli estetikler, veriyi temsil etmek için kullandığınız geom’a bağlıdır. Sonraki bölümde geom’lara daha derinlemesine dalıyoruz.

9.2.1 Alıştırmalar

  1. Noktaların pembe dolgulu üçgenler olduğu bir hwy’ye karşı displ saçılım grafiği oluşturun.

  2. Aşağıdaki kod neden mavi noktalı bir grafikle sonuçlanmadı?

    ggplot(mpg) + 
      geom_point(aes(x = displ, y = hwy, color = "blue"))
  3. stroke estetiği ne işe yarar? Hangi şekillerle çalışır? (İpucu: ?geom_point’i kullanın)

  4. Bir estetiği, aes(color = displ < 5) gibi bir değişken adı dışında bir şeye eşlerseniz ne olur? x ve y’yi de belirtmeniz gerekeceğini unutmayın.

9.3 Geometrik nesneler

Bu iki grafik nasıl benzer?

İki grafik var. Soldaki grafik, araçların otoyol yakıt verimliliğine karşı motor hacminin bir saçılım grafiği; sağdaki grafik ise bu değişkenler arasındaki ilişkinin izlediği yolu takip eden düzgün bir eğri gösteriyor. Düzgün eğrinin etrafında bir güven aralığı da gösteriliyor.

İki grafik var. Soldaki grafik, araçların otoyol yakıt verimliliğine karşı motor hacminin bir saçılım grafiği; sağdaki grafik ise bu değişkenler arasındaki ilişkinin izlediği yolu takip eden düzgün bir eğri gösteriyor. Düzgün eğrinin etrafında bir güven aralığı da gösteriliyor.

Her iki grafik de aynı x ve y değişkenlerini içerir ve aynı verileri gösterir. Ama grafikler aynı değildir. Her grafik, veriyi temsil etmek için farklı bir geometrik nesne, geom, kullanır. Soldaki grafik nokta geom’unu, sağdaki grafik ise verilere uydurulmuş pürüzsüz bir çizgi olan smooth geom’unu kullanır.

Grafiğinizdeki geom’u değiştirmek için, ggplot()’a eklediğiniz geom fonksiyonunu değiştirin. Örneğin, yukarıdaki grafikleri yapmak için şu kodu kullanabilirsiniz:

# Sol
ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point()

# Sağ
ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_smooth()
#> `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

ggplot2’deki her geom fonksiyonu, geom katmanında yerel olarak veya ggplot() katmanında global olarak tanımlanan bir mapping argümanı alır. Ancak her estetik her geom ile çalışmaz. Bir noktanın şeklini ayarlayabilirsiniz ancak bir çizginin “şeklini” ayarlayamazsınız. Denerseniz, ggplot2 o estetik eşlemesini sessizce yok sayar. Öte yandan bir çizginin linetype estetiğini ayarlayabilirsiniz. geom_smooth(), linetype estetiğine eşlediğiniz değişkenin her benzersiz değeri için farklı çizgi tipinde ayrı bir çizgi çizer.

# Sol
ggplot(mpg, aes(x = displ, y = hwy, shape = drv)) + 
  geom_smooth()

# Sağ
ggplot(mpg, aes(x = displ, y = hwy, linetype = drv)) + 
  geom_smooth()

Araçların otoyol yakıt verimliliğine karşı motor hacminin iki grafiği. Veri, düzgün eğrilerle temsil ediliyor. Solda, hepsi aynı çizgi tipine sahip üç düzgün eğri. Sağda, her tahrik tipi için farklı çizgi tiplerine (düz, kesikli veya uzun kesikli) sahip üç düzgün eğri. Her iki grafikte de, düzgün eğrilerin etrafında güven aralıkları da gösteriliyor.

Araçların otoyol yakıt verimliliğine karşı motor hacminin iki grafiği. Veri, düzgün eğrilerle temsil ediliyor. Solda, hepsi aynı çizgi tipine sahip üç düzgün eğri. Sağda, her tahrik tipi için farklı çizgi tiplerine (düz, kesikli veya uzun kesikli) sahip üç düzgün eğri. Her iki grafikte de, düzgün eğrilerin etrafında güven aralıkları da gösteriliyor.

Burada geom_smooth(), araçları, aracın tahrik sistemini tanımlayan drv değerlerine göre üç çizgiye ayırır. Çizgilerden biri 4, biri f, diğeri de r değerine sahip bütün noktaları temsil eder. Burada 4, dört çeker; f, önden çekiş; r ise arkadan itiş anlamına gelir.

Bu garip geliyorsa, çizgileri ham verinin üzerine bindirip ardından her şeyi drv’ye göre renklendirerek bunu daha netleştirebiliriz.

ggplot(mpg, aes(x = displ, y = hwy, color = drv)) + 
  geom_point() +
  geom_smooth(aes(linetype = drv))

Araçların otoyol yakıt verimliliğine karşı motor hacminin bir grafiği. Veri, (tahrik sistemine göre renklendirilmiş) noktalarla ve (çizgi tipi yine tahrik sistemine göre belirlenen) düzgün eğrilerle temsil ediliyor. Düzgün eğrilerin etrafında güven aralıkları da gösteriliyor.

Bu grafiğin aynı grafikte iki geom içerdiğine dikkat edin.

geom_smooth() gibi pek çok geom, birden fazla veri satırını göstermek için tek bir geometrik nesne kullanır. Bu geom’lar için, birden fazla nesne çizmek üzere group estetiğini kategorik bir değişkene ayarlayabilirsiniz. ggplot2, gruplama değişkeninin her benzersiz değeri için ayrı bir nesne çizecektir. Uygulamada, bir estetiği kesikli bir değişkene eşlediğinizde (linetype örneğindeki gibi) ggplot2 bu geom’lara ait verileri otomatik olarak gruplandırır. Bu davranış kullanışlıdır; çünkü group estetiği tek başına geom’lara gösterge veya ayırt edici bir görsel özellik eklemez.

# Sol
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_smooth()

# Orta
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_smooth(aes(group = drv))

# Sağ
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_smooth(aes(color = drv), show.legend = FALSE)

Her biri y ekseninde otoyol yakıt verimliliği, x ekseninde araçların motor hacmi olan ve verinin düzgün bir eğriyle temsil edildiği üç grafik. İlk grafikte yalnızca bu iki değişken var, orta grafikte tahrik sisteminin her düzeyi için üç ayrı düzgün eğri var, sağdaki grafikte ise tahrik sisteminin her düzeyi için aynı üç ayrı düzgün eğri olmakla kalmıyor, bu eğriler farklı renklerde de çiziliyor. Düzgün eğrilerin etrafında güven aralıkları da gösteriliyor.

Her biri y ekseninde otoyol yakıt verimliliği, x ekseninde araçların motor hacmi olan ve verinin düzgün bir eğriyle temsil edildiği üç grafik. İlk grafikte yalnızca bu iki değişken var, orta grafikte tahrik sisteminin her düzeyi için üç ayrı düzgün eğri var, sağdaki grafikte ise tahrik sisteminin her düzeyi için aynı üç ayrı düzgün eğri olmakla kalmıyor, bu eğriler farklı renklerde de çiziliyor. Düzgün eğrilerin etrafında güven aralıkları da gösteriliyor.

Her biri y ekseninde otoyol yakıt verimliliği, x ekseninde araçların motor hacmi olan ve verinin düzgün bir eğriyle temsil edildiği üç grafik. İlk grafikte yalnızca bu iki değişken var, orta grafikte tahrik sisteminin her düzeyi için üç ayrı düzgün eğri var, sağdaki grafikte ise tahrik sisteminin her düzeyi için aynı üç ayrı düzgün eğri olmakla kalmıyor, bu eğriler farklı renklerde de çiziliyor. Düzgün eğrilerin etrafında güven aralıkları da gösteriliyor.

Eşlemeleri bir geom fonksiyonuna yerleştirirseniz, ggplot2 bunları o katman için yerel eşlemeler olarak ele alır. Bu eşlemeleri, global eşlemeleri yalnızca o katman için genişletmek veya üzerine yazmak için kullanır. Bu, farklı katmanlarda farklı estetikler göstermeyi mümkün kılar.

ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point(aes(color = class)) + 
  geom_smooth()

Araçların otoyol yakıt verimliliğine karşı motor hacminin, noktaların araç sınıfına göre renklendirildiği bir saçılım grafiği. Otoyol yakıt verimliliği ile motor hacmi arasındaki ilişkinin izlediği yolu takip eden düzgün bir eğri, etrafındaki güven aralığıyla birlikte üzerine bindirilmiştir.

Aynı fikri, her katman için farklı data belirtmek üzere kullanabilirsiniz. Burada, iki koltuklu araçları vurgulamak için kırmızı noktaları ve içi boş daireleri kullanıyoruz. geom_point() içindeki yerel data argümanı, yalnızca o katmanda ggplot() içindeki genel data argümanını geçersiz kılar.

ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point() + 
  geom_point(
    data = mpg |> filter(class == "2seater"), 
    color = "red"
  ) +
  geom_point(
    data = mpg |> filter(class == "2seater"), 
    shape = "circle open", size = 3, color = "red"
  )

Araçların otoyol yakıt verimliliğine karşı motor hacminin, iki koltuklu araçların kırmızı noktalar ve içi boş dairelerle vurgulandığı bir saçılım grafiği.

Geom’lar, ggplot2’nin temel yapı taşlarıdır. Geom’unu değiştirerek grafiğinizin görünümünü tamamen dönüştürebilirsiniz ve farklı geom’lar verinizin farklı özelliklerini ortaya çıkarabilir. Örneğin aşağıdaki histogram ve yoğunluk grafiği, otoyol yakıt verimliliği dağılımının iki modlu ve sağa çarpık olduğunu; kutu grafiği ise iki olası aykırı değeri gösterir.

# Sol
ggplot(mpg, aes(x = hwy)) +
  geom_histogram(binwidth = 2)

# Orta
ggplot(mpg, aes(x = hwy)) +
  geom_density()

# Sağ
ggplot(mpg, aes(x = hwy)) +
  geom_boxplot()

Üç grafik: otoyol yakıt verimliliğinin histogramı, yoğunluk grafiği ve kutu grafiği.

Üç grafik: otoyol yakıt verimliliğinin histogramı, yoğunluk grafiği ve kutu grafiği.

Üç grafik: otoyol yakıt verimliliğinin histogramı, yoğunluk grafiği ve kutu grafiği.

ggplot2, 40’tan fazla geom sağlar; ama bunlar yapılabilecek tüm olası grafikleri kapsamaz. Farklı bir geom’a ihtiyacınız varsa, önce başka birinin onu zaten uygulayıp uygulamadığını görmek için uzantı paketlerine bakmanızı öneririz (bir örnekleme için https://exts.ggplot2.tidyverse.org/gallery/ adresine bakın). Örneğin, ggridges paketi (https://wilkelab.org/ggridges), kategorik bir değişkenin farklı düzeyleri için sayısal bir değişkenin yoğunluğunu görselleştirmek için yararlı olabilecek sırt çizgisi (ridgeline) grafikleri yapmak için kullanışlıdır. Aşağıdaki grafikte yalnızca yeni bir geom (geom_density_ridges()) kullanmakla kalmadık, aynı değişkeni de birden fazla estetiğe (drv’yi y, fill ve color’a) eşledik ve yoğunluk eğrilerini saydam yapmak için bir estetiği de (alpha = 0.5) ayarladık.

library(ggridges)

ggplot(mpg, aes(x = hwy, y = drv, fill = drv, color = drv)) +
  geom_density_ridges(alpha = 0.5, show.legend = FALSE)
#> Picking joint bandwidth of 1.28

Arkadan itişli, önden çekişli ve dört çekerli araçlar için ayrı ayrı çizilmiş otoyol yakıt verimliliği yoğunluk eğrileri. Dağılım, arkadan itişli ve dört çekerli araçlar için iki modlu ve kabaca simetriktir; önden çekişli araçlar için tek modlu ve sağa çarpıktır.

ggplot2’nin sunduğu tüm geom’lara ve paketteki tüm fonksiyonlara dair kapsamlı bir genel bakış elde etmenin en iyi yeri referans sayfasıdır: https://ggplot2.tidyverse.org/reference. Herhangi bir tek geom hakkında daha fazla bilgi edinmek için yardımı kullanın (örneğin, ?geom_smooth).

9.3.1 Alıştırmalar

  1. Bir çizgi grafiği çizmek için hangi geom’u kullanırsınız? Bir kutu grafiği? Bir histogram? Bir alan grafiği?

  2. Bu bölümde daha önce show.legend’ı açıklamadan kullandık:

    ggplot(mpg, aes(x = displ, y = hwy)) +
      geom_smooth(aes(color = drv), show.legend = FALSE)

    Burada show.legend = FALSE ne işe yarar? Onu kaldırırsanız ne olur? Sizce onu neden daha önce kullandık?

  3. geom_smooth()’un se argümanı ne işe yarar?

  4. Aşağıdaki grafikleri oluşturmak için gereken R kodunu yeniden oluşturun. Grafikte kategorik bir değişken kullanıldığı her yerde bunun drv olduğunu unutmayın.

    Bu şekilde, 3x2'lik bir ızgarada düzenlenmiş altı saçılım grafiği var. Tüm grafiklerde araçların otoyol yakıt verimliliği y ekseninde, motor hacmi ise x ekseninde. İlk grafik, üzerine düzgün bir eğri bindirilmiş tüm noktaları siyah gösteriyor. İkinci grafikte noktalar da hepsi siyah, ama tahrik sisteminin her düzeyi için üzerine ayrı düzgün eğriler bindirilmiş. Üçüncü grafikte, noktalar ve düzgün eğriler tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor. Dördüncü grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor, ama tüm veriye uydurulmuş tek bir düzgün çizgi var. Beşinci grafikte, noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve tahrik sisteminin her düzeyine farklı çizgi tiplerine sahip ayrı bir düzgün eğri uydurulmuş. Son olarak altıncı grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve kalın beyaz bir sınırları var.

    Bu şekilde, 3x2'lik bir ızgarada düzenlenmiş altı saçılım grafiği var. Tüm grafiklerde araçların otoyol yakıt verimliliği y ekseninde, motor hacmi ise x ekseninde. İlk grafik, üzerine düzgün bir eğri bindirilmiş tüm noktaları siyah gösteriyor. İkinci grafikte noktalar da hepsi siyah, ama tahrik sisteminin her düzeyi için üzerine ayrı düzgün eğriler bindirilmiş. Üçüncü grafikte, noktalar ve düzgün eğriler tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor. Dördüncü grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor, ama tüm veriye uydurulmuş tek bir düzgün çizgi var. Beşinci grafikte, noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve tahrik sisteminin her düzeyine farklı çizgi tiplerine sahip ayrı bir düzgün eğri uydurulmuş. Son olarak altıncı grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve kalın beyaz bir sınırları var.

    Bu şekilde, 3x2'lik bir ızgarada düzenlenmiş altı saçılım grafiği var. Tüm grafiklerde araçların otoyol yakıt verimliliği y ekseninde, motor hacmi ise x ekseninde. İlk grafik, üzerine düzgün bir eğri bindirilmiş tüm noktaları siyah gösteriyor. İkinci grafikte noktalar da hepsi siyah, ama tahrik sisteminin her düzeyi için üzerine ayrı düzgün eğriler bindirilmiş. Üçüncü grafikte, noktalar ve düzgün eğriler tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor. Dördüncü grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor, ama tüm veriye uydurulmuş tek bir düzgün çizgi var. Beşinci grafikte, noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve tahrik sisteminin her düzeyine farklı çizgi tiplerine sahip ayrı bir düzgün eğri uydurulmuş. Son olarak altıncı grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve kalın beyaz bir sınırları var.

    Bu şekilde, 3x2'lik bir ızgarada düzenlenmiş altı saçılım grafiği var. Tüm grafiklerde araçların otoyol yakıt verimliliği y ekseninde, motor hacmi ise x ekseninde. İlk grafik, üzerine düzgün bir eğri bindirilmiş tüm noktaları siyah gösteriyor. İkinci grafikte noktalar da hepsi siyah, ama tahrik sisteminin her düzeyi için üzerine ayrı düzgün eğriler bindirilmiş. Üçüncü grafikte, noktalar ve düzgün eğriler tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor. Dördüncü grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor, ama tüm veriye uydurulmuş tek bir düzgün çizgi var. Beşinci grafikte, noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve tahrik sisteminin her düzeyine farklı çizgi tiplerine sahip ayrı bir düzgün eğri uydurulmuş. Son olarak altıncı grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve kalın beyaz bir sınırları var.

    Bu şekilde, 3x2'lik bir ızgarada düzenlenmiş altı saçılım grafiği var. Tüm grafiklerde araçların otoyol yakıt verimliliği y ekseninde, motor hacmi ise x ekseninde. İlk grafik, üzerine düzgün bir eğri bindirilmiş tüm noktaları siyah gösteriyor. İkinci grafikte noktalar da hepsi siyah, ama tahrik sisteminin her düzeyi için üzerine ayrı düzgün eğriler bindirilmiş. Üçüncü grafikte, noktalar ve düzgün eğriler tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor. Dördüncü grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor, ama tüm veriye uydurulmuş tek bir düzgün çizgi var. Beşinci grafikte, noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve tahrik sisteminin her düzeyine farklı çizgi tiplerine sahip ayrı bir düzgün eğri uydurulmuş. Son olarak altıncı grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve kalın beyaz bir sınırları var.

    Bu şekilde, 3x2'lik bir ızgarada düzenlenmiş altı saçılım grafiği var. Tüm grafiklerde araçların otoyol yakıt verimliliği y ekseninde, motor hacmi ise x ekseninde. İlk grafik, üzerine düzgün bir eğri bindirilmiş tüm noktaları siyah gösteriyor. İkinci grafikte noktalar da hepsi siyah, ama tahrik sisteminin her düzeyi için üzerine ayrı düzgün eğriler bindirilmiş. Üçüncü grafikte, noktalar ve düzgün eğriler tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor. Dördüncü grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor, ama tüm veriye uydurulmuş tek bir düzgün çizgi var. Beşinci grafikte, noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve tahrik sisteminin her düzeyine farklı çizgi tiplerine sahip ayrı bir düzgün eğri uydurulmuş. Son olarak altıncı grafikte noktalar tahrik sisteminin her düzeyi için farklı renklerle temsil ediliyor ve kalın beyaz bir sınırları var.

9.4 Paneller

Bölüm 1 bölümünde facet_wrap() ile panellere ayırmayı öğrendiniz. Bu fonksiyon, grafiği kategorik değişkenin her düzeyi için verilerin bir alt kümesini gösteren alt grafiklere böler.

ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point() + 
  facet_wrap(~cyl)

Araçların otoyol yakıt verimliliğine karşı motor hacminin, silindir sayısına göre panellere ayrılmış ve panelleri iki satıra yayılan bir saçılım grafiği.

Grafiğinizi iki değişkenin birleşimine göre panellere ayırmak için facet_wrap() yerine facet_grid() kullanın. facet_grid()’in ilk argümanı da bir formüldür; ama şimdi çift taraflı bir formüldür: rows ~ cols.

ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point() + 
  facet_grid(drv ~ cyl)

Araçların otoyol yakıt verimliliğine karşı motor hacminin, satırlar boyunca silindir sayısına, sütunlar boyunca ise tahrik sistemi türüne göre panellere ayrılmış bir saçılım grafiği. Bu, 12 panelden oluşan 4x3'lük bir ızgarayla sonuçlanır. Bu panellerden bazılarının hiç gözlemi yoktur: 5 silindir ve dört çeker, 4 veya 5 silindir ve önden çekiş.

Varsayılan olarak bütün paneller x ve y eksenlerinde aynı ölçeği ve aralığı paylaşır. Bu, verileri paneller arasında karşılaştırırken yararlıdır; ancak her paneldeki ilişkiyi ayrı ayrı görmek istediğinizde kısıtlayıcı olabilir. Panelleme fonksiyonundaki scales argümanını "free_x" olarak ayarlamak sütunlar arasında farklı x ölçeklerine, "free_y" satırlar arasında farklı y ölçeklerine, "free" ise her ikisine izin verir.

ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point() + 
  facet_grid(drv ~ cyl, scales = "free")

Araçların otoyol yakıt verimliliğine karşı motor hacminin, satırlar boyunca silindir sayısına, sütunlar boyunca ise tahrik sistemi türüne göre panellere ayrılmış bir saçılım grafiği. Bu, 12 panelden oluşan 4x3'lük bir ızgarayla sonuçlanır. Bu panellerden bazılarının hiç gözlemi yoktur: 5 silindir ve dört çeker, 4 veya 5 silindir ve önden çekiş. Bir satırdaki paneller aynı y ölçeğini, bir sütundaki paneller ise aynı x ölçeğini paylaşır.

9.4.1 Alıştırmalar

  1. Sürekli bir değişkene göre panellere ayırırsanız ne olur?

  2. Yukarıdaki grafikte facet_grid(drv ~ cyl) ile boş hücreler ne anlama gelir? Aşağıdaki kodu çalıştırın. Bunlar ortaya çıkan grafikle nasıl ilişkilidir?

    ggplot(mpg) + 
      geom_point(aes(x = drv, y = cyl))
  3. Aşağıdaki kod hangi grafikleri yapar? . ne işe yarar?

    ggplot(mpg) + 
      geom_point(aes(x = displ, y = hwy)) +
      facet_grid(drv ~ .)
    
    ggplot(mpg) + 
      geom_point(aes(x = displ, y = hwy)) +
      facet_grid(. ~ cyl)
  4. Bu bölümde panellere ayrılmış ilk grafiği ele alın:

    ggplot(mpg) + 
      geom_point(aes(x = displ, y = hwy)) + 
      facet_wrap(~ cyl, nrow = 2)

    color estetiği yerine panellere ayırmanın avantajları nelerdir? Dezavantajları nelerdir? Daha büyük bir veri kümeniz olsaydı denge nasıl değişebilirdi?

  5. ?facet_wrap’i okuyun. nrow ne işe yarar? ncol ne işe yarar? Bireysel panellerin düzenini başka hangi seçenekler kontrol eder? facet_grid() neden nrow ve ncol argümanlarına sahip değildir?

  6. Aşağıdaki grafiklerden hangisi, farklı tahrik sistemlerine sahip araçların motor hacmini (displ) karşılaştırmayı kolaylaştırır? Bu sonuç, panelleme değişkenini hangi durumda satırlara veya sütunlara yerleştirmeniz gerektiği hakkında ne söylüyor?

    ggplot(mpg, aes(x = displ)) + 
      geom_histogram() + 
      facet_grid(drv ~ .)
    
    ggplot(mpg, aes(x = displ)) + 
      geom_histogram() +
      facet_grid(. ~ drv)
  7. Aşağıdaki grafiği facet_grid() yerine facet_wrap() kullanarak yeniden oluşturun. Panel etiketlerinin konumları nasıl değişir?

    ggplot(mpg) + 
      geom_point(aes(x = displ, y = hwy)) +
      facet_grid(drv ~ .)

9.5 İstatistiksel dönüşümler

geom_bar() veya geom_col() ile çizilen temel bir çubuk grafiği ele alalım. Aşağıdaki grafik, diamonds veri kümesindeki toplam elmas sayısını cut’a göre gruplandırılmış olarak gösterir. diamonds veri kümesi ggplot2 paketinde bulunur ve her elmasın price, carat, color, clarity ve cut bilgisi dahil olmak üzere ~54.000 elmas hakkında bilgi içerir. Grafik, düşük kaliteli kesimlere göre yüksek kaliteli kesimlere sahip daha fazla elmas bulunduğunu gösterir.

ggplot(diamonds, aes(x = cut)) + 
  geom_bar()

Her elmas kesiminin sayısının çubuk grafiği. Kabaca 1500 Fair, 5000 Good, 12000 Very Good, 14000 Premium ve 22000 Ideal kesim elmas vardır.

Grafik, x ekseninde diamonds’tan bir değişken olan cut’ı gösterir. Y ekseninde ise count gösterilir; ancak count, diamonds içinde bir değişken değildir! Peki count nereden gelir? Saçılım grafikleri gibi pek çok grafik, veri kümenizin ham değerlerini çizer. Çubuk grafikler gibi diğer grafikler ise çizilecek yeni değerler hesaplar:

  • Çubuk grafikler, histogramlar ve frekans poligonları verilerinizi aralıklara (bins) ayırır ve ardından her aralığa düşen nokta sayısını çizer.

  • Pürüzsüzleştiriciler verilere bir model uydurur ve modelin tahminlerini çizer.

  • Kutu grafikleri, dağılımın beş sayı özetini hesaplar ve ardından bu özeti özel olarak biçimlendirilmiş bir kutu olarak gösterir.

Bir grafik için yeni değerleri hesaplamak üzere kullanılan algoritmaya, istatistiksel dönüşümün kısaltması olan bir stat denir. Şekil 9.2 bu sürecin geom_bar() ile nasıl çalıştığını gösterir.

Bir çubuk grafik oluşturmanın üç adımını gösteren bir şekil. Adım 1. geom_bar(), diamonds veri kümesiyle başlar. Adım 2. geom_bar(), veriyi count stat'ı ile dönüştürür; bu, cut değerleri ve sayımlarından oluşan bir veri kümesi döndürür. Adım 3. geom_bar(), grafiği oluşturmak için dönüştürülmüş veriyi kullanır. cut, x eksenine eşlenir, count ise y eksenine eşlenir.
Şekil 9.2: Bir çubuk grafik oluştururken önce ham veriyle başlarız, ardından her çubuktaki gözlem sayısını saymak için onu toplulaştırırız ve son olarak bu hesaplanan değişkenleri grafik estetiklerine eşleriz.

Bir geom’un hangi stat’ı kullandığını, stat argümanının varsayılan değerini inceleyerek öğrenebilirsiniz. Örneğin, ?geom_bar, stat’ın varsayılan değerinin “count” olduğunu gösterir; bu da geom_bar()’ın stat_count()’u kullandığı anlamına gelir. stat_count(), geom_bar() ile aynı sayfada belgelenmiştir. Aşağı kaydırırsanız, “Computed variables” adlı bölüm, iki yeni değişken hesapladığını açıklar: count ve prop.

Her geom’un varsayılan bir stat’ı, her stat’ın da varsayılan bir geom’u vardır. Bu, genellikle altta yatan istatistiksel dönüşümü dert etmeden geom’ları kullanabileceğiniz anlamına gelir. Ancak, bir stat’ı açıkça kullanmanız gerekebilecek üç neden vardır:

  1. Varsayılan stat’ı geçersiz kılmak isteyebilirsiniz. Aşağıdaki kodda, geom_bar()’ın stat’ını count’tan (varsayılan) identity’ye değiştiriyoruz. Bu, çubukların yüksekliğini bir y değişkeninin ham değerlerine eşlememizi sağlar.

    diamonds |>
      count(cut) |>
      ggplot(aes(x = cut, y = n)) +
      geom_bar(stat = "identity")

    Her elmas kesiminin sayısının çubuk grafiği. Kabaca 1500 Fair, 5000 Good, 12000 Very Good, 14000 Premium ve 22000 Ideal kesim elmas vardır.

  2. Dönüştürülmüş değişkenlerden estetiklere olan varsayılan eşlemeyi geçersiz kılmak isteyebilirsiniz. Örneğin, sayımlar yerine oranların bir çubuk grafiğini göstermek isteyebilirsiniz:

    ggplot(diamonds, aes(x = cut, y = after_stat(prop), group = 1)) + 
      geom_bar()

    Her elmas kesiminin oranının çubuk grafiği. Kabaca, Fair elmaslar 0,03'ünü, Good 0,09'unu, Very Good 0,22'sini, Premium 0,26'sını ve Ideal 0,40'ını oluşturur.

    Stat tarafından hesaplanabilecek değişkenleri görmek için geom_bar() yardım sayfasındaki “Computed variables” bölümüne bakın.

  3. Kodunuzdaki istatistiksel dönüşüme daha fazla dikkat çekmek isteyebilirsiniz. Örneğin, hesapladığınız özete dikkat çekmek için, her benzersiz x değeri için y değerlerini özetleyen stat_summary()’yi kullanabilirsiniz:

    ggplot(diamonds) + 
      stat_summary(
        aes(x = cut, y = depth),
        fun.min = min,
        fun.max = max,
        fun = median
      )

    Elmasların y ekseninde depth, x ekseninde ise (fair, good, very good, premium ve ideal düzeyleriyle) cut olan bir grafiği. Her cut düzeyi için, dikey çizgiler o kesim kategorisindeki elmaslar için minimum derinlikten maksimum derinliğe uzanır ve medyan derinlik çizgi üzerinde bir noktayla belirtilir.

ggplot2, kullanmanız için 20’den fazla stat sağlar. Her stat bir fonksiyondur, bu yüzden her zamanki gibi yardım alabilirsiniz, örneğin, ?stat_bin.

9.5.1 Alıştırmalar

  1. stat_summary() ile ilişkili varsayılan geom nedir? Önceki grafiği, stat fonksiyonu yerine o geom fonksiyonunu kullanacak şekilde nasıl yeniden yazabilirsiniz?

  2. geom_col() ne yapar? geom_bar()’dan nasıl farklıdır?

  3. Çoğu geom ve stat, neredeyse her zaman birlikte kullanılan çiftler halinde gelir. Tüm çiftlerin bir listesini yapın. Ortak noktaları nedir? (İpucu: Dokümantasyonu okuyun.)

  4. stat_smooth() hangi değişkenleri hesaplar? Davranışını hangi argümanlar kontrol eder?

  5. Oran çubuk grafiğimizde, group = 1 ayarlamamız gerekti. Neden? Başka bir deyişle, bu iki grafiğin sorunu nedir?

    ggplot(diamonds, aes(x = cut, y = after_stat(prop))) + 
      geom_bar()
    ggplot(diamonds, aes(x = cut, fill = color, y = after_stat(prop))) + 
      geom_bar()

9.6 Konum ayarlamaları

Çubuk grafiklerle ilişkili bir sihir parçası daha var. Bir çubuk grafiği color estetiğini veya, daha kullanışlı olarak, fill estetiğini kullanarak renklendirebilirsiniz:

# Sol
ggplot(mpg, aes(x = drv, color = drv)) + 
  geom_bar()

# Sağ
ggplot(mpg, aes(x = drv, fill = drv)) + 
  geom_bar()

Araçların tahrik türlerinin iki çubuk grafiği. İlk grafikte, çubukların renkli sınırları var. İkinci grafikte, renklerle doldurulmuşlar. Çubukların yükseklikleri, her drv kategorisindeki araç sayısına karşılık gelir.

Araçların tahrik türlerinin iki çubuk grafiği. İlk grafikte, çubukların renkli sınırları var. İkinci grafikte, renklerle doldurulmuşlar. Çubukların yükseklikleri, her drv kategorisindeki araç sayısına karşılık gelir.

fill estetiğini class gibi başka bir değişkene eşlediğinizde çubukların otomatik olarak yığıldığına dikkat edin. Her renkli dikdörtgen, drv ve class’ın bir kombinasyonunu temsil eder.

ggplot(mpg, aes(x = drv, fill = class)) + 
  geom_bar()

Araçların tahrik türlerinin, her çubuğun araç sınıfları için renklerle dolduğu bölümlere ayrılmış bir çubuk grafiği. Çubukların yükseklikleri, her tahrik kategorisindeki araç sayısına karşılık gelir; renkli bölümlerin yükseklikleri ise belirli bir tahrik türü düzeyi içinde belirli bir sınıf düzeyine sahip araç sayısını temsil eder.

Yığma işlemi, position argümanı tarafından belirtilen konum ayarlaması (position adjustment) kullanılarak otomatik olarak gerçekleştirilir. Yığılmış bir çubuk grafiği istemiyorsanız, diğer üç seçenekten birini kullanabilirsiniz: "identity", "dodge" veya "fill".

  • position = "identity", her nesneyi grafik bağlamında tam olarak düştüğü yere yerleştirir. Bu, çubuklar için pek kullanışlı değildir; çünkü onları üst üste bindirir. Bu üst üste binmeyi görmek için, çubukları ya alpha’yı küçük bir değere ayarlayarak biraz saydam ya da fill = NA ayarlayarak tamamen saydam yapmamız gerekir.

    # Sol
    ggplot(mpg, aes(x = drv, fill = class)) + 
      geom_bar(alpha = 1/5, position = "identity")
    
    # Sağ
    ggplot(mpg, aes(x = drv, color = class)) + 
      geom_bar(fill = NA, position = "identity")

    Araçların tahrik türlerinin, her çubuğun araç sınıfları için renklerle dolduğu bölümlere ayrılmış bir çubuk grafiği. Renkli bölümlerin yükseklikleri, belirli bir tahrik türü düzeyi içinde belirli bir sınıf düzeyine sahip araç sayısını temsil eder. Ancak bölümler üst üste biniyor. İlk grafikte çubuklar saydam renklerle doldurulmuş, ikinci grafikte ise yalnızca renkle çizilmişler.

    Araçların tahrik türlerinin, her çubuğun araç sınıfları için renklerle dolduğu bölümlere ayrılmış bir çubuk grafiği. Renkli bölümlerin yükseklikleri, belirli bir tahrik türü düzeyi içinde belirli bir sınıf düzeyine sahip araç sayısını temsil eder. Ancak bölümler üst üste biniyor. İlk grafikte çubuklar saydam renklerle doldurulmuş, ikinci grafikte ise yalnızca renkle çizilmişler.

    Identity konum ayarlaması, varsayılan olarak bu ayarı kullanan noktalar gibi iki boyutlu geom’larda daha yararlıdır.

  • position = "fill", yığma gibi çalışır; ama her yığılmış çubuk kümesini aynı yükseklikte yapar. Bu, oranları gruplar arasında karşılaştırmayı kolaylaştırır.

  • position = "dodge", üst üste binen nesneleri doğrudan birbirinin yanına yerleştirir. Bu, bireysel değerleri karşılaştırmayı kolaylaştırır.

    # Sol
    ggplot(mpg, aes(x = drv, fill = class)) + 
      geom_bar(position = "fill")
    
    # Sağ
    ggplot(mpg, aes(x = drv, fill = class)) + 
      geom_bar(position = "dodge")

    Solda, araçların tahrik türlerinin, her çubuğun class düzeyleri için renklerle dolduğu bölümlere ayrılmış bir çubuk grafiği. Her çubuğun yüksekliği 1'dir ve renkli bölümlerin yükseklikleri, belirli bir tahrik türü içinde belirli bir sınıf düzeyine sahip araçların oranlarını temsil eder. Sağda, araçların tahrik türlerinin yan yana dizilmiş (dodged) bir çubuk grafiği. Yan yana dizilmiş çubuklar, tahrik türü düzeylerine göre gruplandırılmıştır. Her grup içinde çubuklar, her sınıf düzeyini temsil eder. Bazı sınıflar bazı tahrik türlerinde temsil edilirken diğerlerinde temsil edilmez, bu da her grup içinde eşit olmayan sayıda çubukla sonuçlanır. Bu çubukların yükseklikleri, belirli bir tahrik türü ve sınıf düzeyine sahip araç sayısını temsil eder.

    Solda, araçların tahrik türlerinin, her çubuğun class düzeyleri için renklerle dolduğu bölümlere ayrılmış bir çubuk grafiği. Her çubuğun yüksekliği 1'dir ve renkli bölümlerin yükseklikleri, belirli bir tahrik türü içinde belirli bir sınıf düzeyine sahip araçların oranlarını temsil eder. Sağda, araçların tahrik türlerinin yan yana dizilmiş (dodged) bir çubuk grafiği. Yan yana dizilmiş çubuklar, tahrik türü düzeylerine göre gruplandırılmıştır. Her grup içinde çubuklar, her sınıf düzeyini temsil eder. Bazı sınıflar bazı tahrik türlerinde temsil edilirken diğerlerinde temsil edilmez, bu da her grup içinde eşit olmayan sayıda çubukla sonuçlanır. Bu çubukların yükseklikleri, belirli bir tahrik türü ve sınıf düzeyine sahip araç sayısını temsil eder.

Çubuk grafikler için kullanışlı olmayan, ama saçılım grafikleri için çok kullanışlı olabilecek bir başka ayarlama türü daha var. İlk saçılım grafiğimizi hatırlayın. Veri kümesinde 234 gözlem olmasına rağmen, grafiğin yalnızca 126 nokta gösterdiğini fark ettiniz mi?

Araçların otoyol yakıt verimliliğine karşı motor hacminin, negatif bir ilişki gösteren bir saçılım grafiği.

hwy ve displ’in temeldeki değerleri yuvarlanmıştır, bu yüzden noktalar bir ızgara üzerinde görünür ve pek çok nokta birbirinin üzerine biner. Bu soruna üst üste çizim (overplotting) denir. Bu düzenleme, verinin dağılımını görmeyi zorlaştırır. Veri noktaları grafiğe eşit şekilde mi yayılmış, yoksa 109 değer içeren, hwy ve displ’in özel bir kombinasyonu mu var?

Konum ayarlamasını "jitter" olarak ayarlayarak bu ızgara görünümünü önleyebilirsiniz. position = "jitter", her noktaya küçük miktarda rastgele gürültü ekler. Bu, noktaları birbirinden ayırır; çünkü iki noktanın aynı miktarda rastgele gürültü alma olasılığı düşüktür.

ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point(position = "jitter")

Araçların otoyol yakıt verimliliğine karşı motor hacminin noktalarına jitter uygulanmış bir saçılım grafiği. Grafik negatif bir ilişki gösteriyor.

Rastgelelik eklemek grafiği iyileştirmenin tuhaf bir yolu gibi görünebilir; ancak küçük ölçekte doğruluğu biraz azaltırken büyük ölçekte grafiği daha açıklayıcı hâle getirir. Bu çok kullanışlı bir işlem olduğundan, ggplot2, geom_point(position = "jitter") için bir kısayolla birlikte gelir: geom_jitter().

Bir konum ayarlaması hakkında daha fazla bilgi edinmek için, her ayarlamayla ilişkili yardım sayfasına bakın: ?position_dodge, ?position_fill, ?position_identity, ?position_jitter ve ?position_stack.

9.6.1 Alıştırmalar

  1. Aşağıdaki grafiğin sorunu nedir? Onu nasıl iyileştirebilirsiniz?

    ggplot(mpg, aes(x = cty, y = hwy)) + 
      geom_point()
  2. İki grafik arasında, varsa, ne fark var? Neden?

    ggplot(mpg, aes(x = displ, y = hwy)) +
      geom_point()
    ggplot(mpg, aes(x = displ, y = hwy)) +
      geom_point(position = "identity")
  3. geom_jitter() fonksiyonunda jitter miktarını hangi argümanlar denetler?

  4. geom_jitter()’ı geom_count() ile karşılaştırıp karşıtlaştırın.

  5. geom_boxplot()’un varsayılan konum ayarlaması nedir? Bunu gösteren bir mpg veri kümesi görselleştirmesi oluşturun.

9.7 Koordinat sistemleri

Koordinat sistemleri muhtemelen ggplot2’nin en karmaşık parçasıdır. Varsayılan koordinat sistemi, x ve y konumlarının her noktanın yerini belirlemek için bağımsız olarak hareket ettiği Kartezyen koordinat sistemidir. Zaman zaman yardımcı olan iki koordinat sistemi daha vardır.

  • coord_quickmap(), coğrafi haritalar için en boy oranını doğru şekilde ayarlar. ggplot2 ile mekansal veri çiziyorsanız bu çok önemlidir. Bu kitapta haritaları ele alacak alanımız yok; ancak ggplot2: Elegant graphics for data analysis kitabının Maps bölümünde daha fazla bilgi bulabilirsiniz.

    nz <- map_data("nz")
    
    ggplot(nz, aes(x = long, y = lat, group = group)) +
      geom_polygon(fill = "white", color = "black")
    
    ggplot(nz, aes(x = long, y = lat, group = group)) +
      geom_polygon(fill = "white", color = "black") +
      coord_quickmap()

    Yeni Zelanda sınırlarının iki haritası. İlk grafikte en boy oranı yanlış, ikinci grafikte doğru.

    Yeni Zelanda sınırlarının iki haritası. İlk grafikte en boy oranı yanlış, ikinci grafikte doğru.

  • coord_polar(), kutupsal koordinatları kullanır. Kutupsal koordinatlar, bir çubuk grafik ile bir Coxcomb grafiği arasındaki ilginç bir bağlantıyı ortaya çıkarır.

    bar <- ggplot(data = diamonds) + 
      geom_bar(
        mapping = aes(x = clarity, fill = clarity), 
        show.legend = FALSE,
        width = 1
      ) + 
      theme(aspect.ratio = 1)
    
    bar + coord_flip()
    bar + coord_polar()

    İki grafik var. Solda elmasların berraklığının bir çubuk grafiği, sağda aynı verinin bir Coxcomb grafiği var.

    İki grafik var. Solda elmasların berraklığının bir çubuk grafiği, sağda aynı verinin bir Coxcomb grafiği var.

9.7.1 Alıştırmalar

  1. coord_polar() kullanarak yığılmış bir çubuk grafiğini bir pasta grafiğine dönüştürün.

  2. coord_quickmap() ile coord_map() arasındaki fark nedir?

  3. Aşağıdaki grafik, şehir içi ve otoyol mpg’si arasındaki ilişki hakkında size ne anlatıyor? coord_fixed() neden önemlidir? geom_abline() ne yapar?

    ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
      geom_point() + 
      geom_abline() +
      coord_fixed()

9.8 Katmanlı grafik grameri

Bölüm 1.3 içinde öğrendiğiniz grafik şablonunu konum ayarlamaları, istatistikler, koordinat sistemleri ve panelleme ekleyerek genişletebiliriz:

ggplot(data = <VERİ>) +
  <GEOM_FONKSİYONU>(
     mapping = aes(<EŞLEMELER>),
     stat = <STAT>, 
     position = <KONUM>
  ) +
  <KOORDİNAT_FONKSİYONU> +
  <FACET_FONKSİYONU>

Yeni şablonumuz, şablonda açılı parantezler içinde görünen yedi parametre alır. Pratikte, bir grafik oluşturmak için nadiren yedi parametrenin tamamını sağlamanız gerekir; çünkü ggplot2, veri, eşlemeler ve geom fonksiyonu dışındaki her şey için kullanışlı varsayılanlar sağlar.

Şablondaki yedi parametre, grafikler oluşturmak için biçimsel bir sistem olan grafik gramerini oluşturur. Grafik grameri, herhangi bir grafiğin veri kümesi, geom, eşleme kümesi, stat, konum ayarlaması, koordinat sistemi, panelleme şeması ve tema birleşimiyle benzersiz biçimde tanımlanabileceği içgörüsüne dayanır.

Bunun nasıl çalıştığını görmek için temel bir grafiği sıfırdan nasıl oluşturabileceğinizi düşünün. Bir veri kümesiyle başlayıp onu bir stat aracılığıyla göstermek istediğiniz bilgiye dönüştürebilirsiniz. Sonra dönüştürülmüş verilerdeki her gözlemi temsil edecek geometrik nesneyi seçebilirsiniz. Ardından verilerdeki değişkenleri temsil etmek için geom’ların estetik özelliklerini kullanabilirsiniz. Her değişkenin değerlerini bir estetiğin düzeylerine eşlersiniz. Bu adımlar Şekil 9.3 içinde gösterilmiştir. Ardından, x ve y değişkenlerinin değerlerini görüntülemek için nesnelerin konumunu (kendisi de bir estetik özellik olan) kullanarak geom’ları yerleştireceğiniz bir koordinat sistemi seçersiniz.

Her satırın bir cut düzeyini temsil ettiği ve bir count sütununun o cut düzeyinde kaç elmas olduğunu gösterdiği bir frekans tablosuna, ham veriden gitmenin adımlarını gösteren bir şekil. Ardından, bu değerler çubukların yüksekliklerine eşlenir.
Şekil 9.3: Ham veriden bir frekans tablosuna, oradan da çubukların yüksekliklerinin frekansları temsil ettiği bir çubuk grafiğine gitmenin adımları.

Bu noktada eksiksiz bir grafiğiniz olur. Yine de geom’ların koordinat sistemi içindeki konumlarını bir konum ayarlamasıyla değiştirebilir veya grafiği panellere bölebilirsiniz. Ayrıca her biri bir veri kümesi, geom, eşleme kümesi, stat ve konum ayarlaması kullanan bir veya daha fazla katman ekleyerek grafiği genişletebilirsiniz.

Hayal ettiğiniz herhangi bir grafiği oluşturmak için bu yöntemi kullanabilirdiniz. Başka bir deyişle, bu bölümde öğrendiğiniz kod şablonunu yüz binlerce benzersiz grafik oluşturmak için kullanabilirsiniz.

ggplot2’nin kuramsal temelleri hakkında daha fazla bilgi edinmek isterseniz kuramı ayrıntılı olarak açıklayan The Layered Grammar of Graphics makalesini okuyabilirsiniz.

9.9 Özet

Bu bölümde katmanlı grafik gramerini öğrendiniz. Basit bir grafik oluşturmak için estetikler ve geometrilerle başladık; grafiği alt kümelere bölmek için panelleri, geom’ların nasıl hesaplandığını anlamak için istatistikleri, üst üste binmeleri denetlemek için konum ayarlamalarını ve x ile y konumlarının anlamını kökten değiştiren koordinat sistemlerini ele aldık. Henüz değinmediğimiz katman temadır; onu Bölüm 11.5 bölümünde tanıtacağız.

ggplot2 işlevlerinin genel görünümü için iki yararlı kaynak vardır: ggplot2 hızlı başvuru sayfası ve ggplot2 paket sitesi.

Bu bölümden çıkarmanız gereken önemli bir ders, ggplot2 tarafından sağlanmayan bir geom’a ihtiyaç duyduğunuzu hissettiğinizde, başkasının o geom’u sunan bir ggplot2 uzantı paketi oluşturarak sorununuzu çoktan çözmüş olup olmadığını araştırmanın her zaman iyi bir fikir olduğudur.