11  İletişim

11.1 Giriş

Bölüm 10 içinde, grafikleri keşif araçları olarak nasıl kullanacağınızı öğrendiniz. Keşifçi grafikler oluştururken, daha grafiğe bakmadan hangi değişkenleri göstereceğini bilirsiniz. Her grafiği belirli bir amaçla oluşturur, hızla inceleyip bir sonrakine geçersiniz. Çoğu analiz sürecinde, çoğu hemen atılan onlarca veya yüzlerce grafik üreteceksiniz.

Artık verinizi anladığınıza göre, anlayışınızı başkalarına iletmeniz gerekir. Okuyucularınız muhtemelen sizin ön bilgilerinize sahip olmayacak ve veriye sizin kadar hâkim olmayacaktır. Başkalarının veriye ilişkin doğru bir zihinsel modeli hızla oluşturmasına yardımcı olmak için grafiklerinizi olabildiğince kendi kendini açıklar hâle getirmeye ciddi emek vermeniz gerekir. Bu bölümde, ggplot2’nin bunu yapmak için sağladığı bazı araçları öğreneceksiniz.

Bu bölüm, iyi grafikler oluşturmak için ihtiyaç duyduğunuz araçlara odaklanır. Ne istediğinizi bildiğinizi ve yalnızca bunu nasıl yapacağınızı bilmeniz gerektiğini varsayıyoruz. Bu nedenle, bu bölümü iyi bir genel görselleştirme kitabıyla eşleştirmenizi şiddetle öneririz. Albert Cairo’nun The Truthful Art kitabını özellikle beğeniyoruz. Bu kitap, görselleştirmeler oluşturmanın mekaniğini öğretmez; bunun yerine etkili grafikler oluşturmak için ne düşünmeniz gerektiğine odaklanır.

11.1.1 Ön koşullar

Bu bölümde, bir kez daha ggplot2’ye odaklanacağız. Ayrıca veri işleme için biraz dplyr; varsayılan kesme noktalarını, etiketleri, dönüşümleri ve paletleri değiştirmek için scales; Kamil Slowikowski’nin ggrepel (https://ggrepel.slowkow.com) ve Thomas Lin Pedersen’in patchwork (https://patchwork.data-imaginist.com) paketleri dâhil birkaç ggplot2 uzantısı kullanacağız. Bu paketlere zaten sahip değilseniz, onları install.packages() ile kurmanız gerekeceğini unutmayın.

11.2 Etiketler

Keşifçi bir grafiği açıklayıcı bir grafiğe dönüştürürken başlanacak en kolay yer, iyi etiketlerdir. Etiketleri labs() fonksiyonuyla eklersiniz.

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = class)) +
  geom_smooth(se = FALSE) +
  labs(
    x = "Motor hacmi (L)",
    y = "Otoyol yakıt verimliliği (mpg)",
    color = "Araç türü",
    title = "Motor büyüdükçe yakıt verimliliği genellikle düşer",
    subtitle = "İki koltuklu araçlar (spor otomobiller), hafif oldukları için bu eğilimin dışındadır",
    caption = "Veri kaynağı: fueleconomy.gov"
  )

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şkiyi izleyen pürüzsüz bir eğri üzerine bindirilmiştir. X ekseni "Motor hacmi (L)", y ekseni ise "Otoyol yakıt verimliliği (mpg)" olarak etiketlenmiştir. Gösterge "Araç türü" olarak etiketlenmiştir. Grafiğin başlığı "Motor büyüdükçe yakıt verimliliği genellikle düşer"dir. Alt başlığı "İki koltuklu araçlar (spor otomobiller), hafif oldukları için bu eğilimin dışındadır" ve alt yazısı "Veri kaynağı: fueleconomy.gov sitesidir.

Bir grafik başlığının amacı, ana bulguyu özetlemektir. Grafiğin ne olduğunu yalnızca tanımlayan başlıklardan kaçının, örneğin, “Motor hacmine karşı yakıt verimliliğinin bir saçılım grafiği”.

Daha fazla metin eklemeniz gerekiyorsa iki kullanışlı etiket daha vardır: subtitle, başlığın altına daha küçük bir yazı tipiyle ek ayrıntı; caption ise grafiğin sağ altına, genellikle veri kaynağını belirten bir metin ekler. Ayrıca eksen ve gösterge başlıklarını değiştirmek için labs()’i kullanabilirsiniz. Kısa değişken adlarını daha ayrıntılı açıklamalarla değiştirmek ve birimleri dahil etmek genellikle iyi bir fikirdir.

Metin dizeleri yerine matematiksel denklemler kullanmak mümkündür. Yalnızca ""’i quote() ile değiştirin ve mevcut seçenekleri ?plotmath içinde okuyun:

df <- tibble(
  x = 1:10,
  y = cumsum(x^2)
)

ggplot(df, aes(x, y)) +
  geom_point() +
  labs(
    x = quote(x[i]),
    y = quote(sum(x[i] ^ 2, i == 1, n))
  )

X ve y eksen etiketlerinde matematik metni bulunan bir saçılım grafiği. X ekseni etiketi x_i yazıyor, y ekseni etiketi ise i, 1'den n'e kadar olmak üzere x_i karelerinin toplamını yazıyor.

11.2.1 Alıştırmalar

  1. Özelleştirilmiş title, subtitle, caption, x, y ve color etiketleriyle yakıt verimliliği verisi üzerinde bir grafik oluşturun.

  2. Yakıt verimliliği verisini kullanarak aşağıdaki grafiği yeniden oluşturun. Hem noktaların renklerinin hem de şekillerinin tahrik sistemi türüne göre değiştiğine dikkat edin.

    Otoyol yakıt verimliliğine karşı şehir içi yakıt verimliliğinin bir saçılım grafiği. Noktaların şekilleri ve renkleri tahrik sistemi türüne göre belirlenir.

  3. Geçen ay oluşturduğunuz keşifçi bir grafiği alın ve başkalarının anlamasını kolaylaştırmak için bilgilendirici başlıklar ekleyin.

11.3 Açıklama notları

Grafiğinizin ana bileşenlerini etiketlemenin yanı sıra, tek tek gözlemleri veya gözlem gruplarını etiketlemek de genellikle kullanışlıdır. Kullanabileceğiniz ilk araç geom_text()’tir. geom_text(), geom_point()’e benzer; ama ek bir estetiği vardır: label. Bu, grafiklerinize metinsel etiketler eklemeyi mümkün kılar.

Etiketler için iki olası kaynak vardır. İlk olarak, etiketleri sağlayan bir tibble’ınız olabilir. Aşağıdaki grafikte, her tahrik türündeki en yüksek motor hacmine sahip araçları çıkarıyoruz ve bilgilerini label_info adlı yeni bir veri çerçevesi olarak kaydediyoruz.

label_info <- mpg |>
  group_by(drv) |>
  arrange(desc(displ)) |>
  slice_head(n = 1) |>
  mutate(
    drive_type = case_when(
      drv == "f" ~ "önden çekiş",
      drv == "r" ~ "arkadan çekiş",
      drv == "4" ~ "dört çeker"
    )
  ) |>
  select(displ, hwy, drv, drive_type)

label_info
#> # A tibble: 3 × 4
#> # Groups:   drv [3]
#>   displ   hwy drv   drive_type   
#>   <dbl> <int> <chr> <chr>        
#> 1   6.5    17 4     dört çeker   
#> 2   5.3    25 f     önden çekiş  
#> 3   7      24 r     arkadan çekiş

Ardından bu yeni veri çerçevesini, gösterge yerine doğrudan grafiğe yerleştirilen etiketlerle üç grubu tanımlamak için kullanırız. fontface ve size argümanlarını kullanarak metin etiketlerinin görünümünü özelleştirebiliriz. Bu etiketler grafikteki diğer metinlerden daha büyük ve kalındır. theme(legend.position = "none") tüm göstergeleri kapatır; buna birazdan yeniden değineceğiz.

ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
  geom_point(alpha = 0.3) +
  geom_smooth(se = FALSE) +
  geom_text(
    data = label_info, 
    aes(x = displ, y = hwy, label = drive_type),
    fontface = "bold", size = 5, hjust = "right", vjust = "bottom"
  ) +
  theme(legend.position = "none")
#> `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Noktaların tahrik türüne göre renklendirildiği, otoyol yakıt verimliliğine karşı motor hacminin bir saçılım grafiği. Her tahrik türü için düzgün eğriler üzerine bindirilmiştir. Metin etiketleri eğrileri ön çekiş, arka çekiş ve 4 çeker olarak tanımlar.

Etiketin hizalamasını kontrol etmek için hjust (yatay hizalama) ve vjust (dikey hizalama) kullanımına dikkat edin.

Ancak, yukarıda oluşturduğumuz açıklama notlu grafiği okumak zordur; çünkü etiketler birbiriyle ve noktalarla çakışıyor. Bu iki sorunu da çözmek için ggrepel paketinden geom_label_repel() fonksiyonunu kullanabiliriz. Bu kullanışlı paket, etiketleri çakışmayacak şekilde otomatik olarak ayarlayacaktır:

ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
  geom_point(alpha = 0.3) +
  geom_smooth(se = FALSE) +
  geom_label_repel(
    data = label_info, 
    aes(x = displ, y = hwy, label = drive_type),
    fontface = "bold", size = 5, nudge_y = 2
  ) +
  theme(legend.position = "none")
#> `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Noktaların tahrik türüne göre renklendirildiği, otoyol yakıt verimliliğine karşı motor hacminin bir saçılım grafiği. Her tahrik türü için düzgün eğriler üzerine bindirilmiştir. Metin etiketleri eğrileri ön çekiş, arka çekiş ve 4 çeker olarak tanımlar. Etiketler beyaz arka planlı kutular şeklindedir ve çakışmayacak şekilde konumlandırılmıştır.

Aynı fikri, ggrepel paketinden geom_text_repel() ile bir grafikteki belirli noktaları vurgulamak için de kullanabilirsiniz. Burada kullanılan başka bir kullanışlı tekniğe dikkat edin: etiketlenen noktaları daha da vurgulamak için büyük, içi boş noktalardan oluşan ikinci bir katman ekledik.

potential_outliers <- mpg |>
  filter(hwy > 40 | (hwy > 20 & displ > 5))
  
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  geom_text_repel(data = potential_outliers, aes(label = model)) +
  geom_point(data = potential_outliers, color = "red") +
  geom_point(
    data = potential_outliers,
    color = "red", size = 3, shape = "circle open"
  )

Araçların otoyol yakıt verimliliğine karşı motor hacminin bir saçılım grafiği. Otoyol yakıt verimliliği 40'ın üzerinde olan ve motor hacmi 5'in üzerindeyken 20'nin üzerinde olan noktalar kırmızı, içi boş kırmızı bir daireyle işaretlenmiş ve aracın model adıyla etiketlenmiştir.

Unutmayın, geom_text() ve geom_label()’e ek olarak, grafiğinize açıklama notu eklemenize yardımcı olacak ggplot2’de kullanabileceğiniz pek çok başka geom vardır. Birkaç fikir:

  • Referans çizgileri eklemek için geom_hline() ve geom_vline()’ı kullanın. Genellikle onları kalın (linewidth = 2) ve beyaz (color = white) yapar ve ana veri katmanının altına çizeriz. Bu, veriden dikkati dağıtmadan onları kolayca görmeyi sağlar.

  • İlgi çekici noktaların etrafına bir dikdörtgen çizmek için geom_rect()’i kullanın. Dikdörtgenin sınırları xmin, xmax, ymin, ymax estetikleriyle tanımlanır. Alternatif olarak, nokta alt kümelerini dışbükey zarflarla (hulls) belirtmenizi sağlayan ggforce paketine, özellikle de geom_mark_hull() fonksiyonuna bakın.

  • Bir noktaya bir okla dikkat çekmek için arrow argümanıyla geom_segment()’i kullanın. Başlangıç konumunu tanımlamak için x ve y estetiklerini, bitiş konumunu tanımlamak için ise xend ve yend estetiklerini kullanın.

Grafiklere açıklama notu eklemek için başka bir kullanışlı fonksiyon annotate()’tir. Genel bir kural olarak, geom’lar verinin bir alt kümesini vurgulamak için genellikle kullanışlıyken, annotate() bir grafiğe bir veya birkaç açıklama notu öğesi eklemek için kullanışlıdır.

annotate() kullanımını göstermek için, grafiğimize eklemek üzere bir metin oluşturalım. Metin biraz uzun, bu yüzden satır başına istediğiniz karakter sayısına göre otomatik olarak satır sonları eklemek için stringr::str_wrap()’i kullanacağız:

trend_text <- "Motor büyüdükçe yakıt verimliliği düşme eğilimindedir." |>
  str_wrap(width = 30)
trend_text
#> [1] "Motor büyüdükçe yakıt\nverimliliği düşme\neğilimindedir."

Ardından iki açıklama notu katmanı ekliyoruz: biri etiket, diğeri doğru parçası geom’uyla. Her ikisindeki x ve y estetikleri açıklama notunun nerede başlayacağını tanımlar, segment açıklama notundaki xend ve yend estetikleri ise segmentin bitiş konumunu tanımlar. Segmentin bir ok olarak biçimlendirildiğine de dikkat edin.

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  annotate(
    geom = "label", x = 3.5, y = 38,
    label = trend_text,
    hjust = "left", color = "red"
  ) +
  annotate(
    geom = "segment",
    x = 3, y = 35, xend = 5, yend = 25, color = "red",
    arrow = arrow(type = "closed")
  )

Araçların otoyol yakıt verimliliğine karşı motor hacminin bir saçılım grafiği. Aşağı işaret eden kırmızı bir ok, noktaların eğilimini takip eder ve okun yanına yerleştirilen açıklama notu "Motor büyüdükçe yakıt verimliliği düşme eğilimindedir" yazıyor. Ok ve açıklama notu metni kırmızı.

Açıklama notu ekleme, görselleştirmelerinizin ana çıkarımlarını ve ilginç özelliklerini iletmek için güçlü bir araçtır. Tek sınır hayal gücünüzdür (ve açıklama notlarını estetik olarak hoş bir şekilde konumlandırma konusundaki sabrınız)!

11.3.1 Alıştırmalar

  1. Grafiğin dört köşesine metin yerleştirmek için sonsuz konumlarla geom_text()’i kullanın.

  2. Bir tibble oluşturmak zorunda kalmadan son grafiğinizin ortasına bir nokta geom’u eklemek için annotate()’i kullanın. Noktanın şeklini, boyutunu veya rengini özelleştirin.

  3. geom_text() ile etiketler panellemeyle nasıl etkileşir? Tek bir panele nasıl etiket ekleyebilirsiniz? Her panele farklı bir etiketi nasıl yerleştirebilirsiniz? (İpucu: geom_text()’e aktarılan veri kümesini düşünün.)

  4. geom_label()’e hangi argümanlar arka plan kutusunun görünümünü kontrol eder?

  5. arrow()’un dört argümanı nedir? Nasıl çalışırlar? En önemli seçenekleri gösteren bir dizi grafik oluşturun.

11.4 Ölçekler

Grafiğinizi iletişim için daha etkili kılmanın üçüncü yolu ölçekleri ayarlamaktır. Ölçekler, estetik eşlemelerin görsel olarak nasıl gösterileceğini belirler.

11.4.1 Varsayılan ölçekler

Normalde ggplot2, ölçekleri sizin için otomatik olarak ekler. Örneğin, şunu yazdığınızda:

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

ggplot2, arka planda varsayılan ölçekleri otomatik olarak ekler:

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = class)) +
  scale_x_continuous() +
  scale_y_continuous() +
  scale_color_discrete()

Ölçeklerin adlandırma düzenine dikkat edin: scale_ önekini estetiğin adı, _ ve ölçeğin adı izler. Varsayılan ölçekler, eşleştirildikleri değişken türüne göre adlandırılır: sürekli (continuous), kesikli (discrete), tarih-saat (datetime) veya tarih (date). scale_x_continuous(), displ’den gelen sayısal değerleri x ekseninde sürekli bir sayı doğrusuna yerleştirir, scale_color_discrete() her araç class’ı için renkler seçer, vb. Aşağıda öğreneceğiniz, varsayılan olmayan pek çok ölçek vardır.

Varsayılan ölçekler, geniş bir girdi yelpazesinde iyi sonuç verecek biçimde özenle seçilmiştir. Yine de, iki nedenden dolayı varsayılanları geçersiz kılmak isteyebilirsiniz:

  • Varsayılan ölçeğin bazı parametrelerinde ince ayar yapmak isteyebilirsiniz. Böylece eksenlerdeki kesme noktalarını veya göstergedeki anahtar etiketlerini değiştirebilirsiniz.

  • Ölçeği tamamen değiştirip bambaşka bir algoritma kullanmak isteyebilirsiniz. Genellikle veri hakkında daha fazla bilgi sahibi olduğunuzdan, varsayılandan daha iyisini yapabilirsiniz.

11.4.2 Eksen işaretleri ve gösterge anahtarları

Eksenler ve göstergeler topluca kılavuzlar (guides) olarak adlandırılır. Eksenler x ve y estetikleri, göstergeler ise diğer estetikler için kullanılır.

Eksen işaretlerinin ve gösterge anahtarlarının görünümünü etkileyen iki temel argüman vardır: breaks ve labels. breaks, işaretlerin konumunu veya anahtarlarla ilişkili değerleri; labels ise her işaret ya da anahtarla ilişkili metni belirler. breaks en sık varsayılan seçimi değiştirmek için kullanılır:

ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
  geom_point() +
  scale_y_continuous(breaks = seq(15, 40, by = 5)) 

Araçların otoyol yakıt verimliliğine karşı motor hacminin, drive'a göre renklendirilmiş bir saçılım grafiği. Y ekseni, 15'te başlayıp 40'ta biten ve 5'er artan kesme noktalarına sahip.

labels’i aynı şekilde kullanabilirsiniz (breaks ile aynı uzunlukta bir karakter vektörü); ama etiketleri tamamen bastırmak için onu NULL olarak da ayarlayabilirsiniz. Bu, haritalar için veya mutlak sayıları paylaşamayacağınız grafikleri yayımlamak için kullanışlı olabilir. Göstergelerin görünümünü belirlemek için de breaks ve labels’i kullanabilirsiniz. Kategorik değişkenlere ait kesikli ölçeklerde labels, mevcut düzey adlarını istenen etiketlerle eşleyen adlandırılmış bir liste olabilir.

ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
  geom_point() +
  scale_x_continuous(labels = NULL) +
  scale_y_continuous(labels = NULL) +
  scale_color_discrete(labels = c("4" = "dört çeker", "f" = "önden çekiş", "r" = "arkadan çekiş"))

Araçların otoyol yakıt verimliliğine karşı motor hacminin, drive'a göre renklendirilmiş bir saçılım grafiği. X ve y eksenlerinin eksen işaretlerinde herhangi bir etiket yok. Göstergenin özel etiketleri var: dört çeker, önden çekiş, arkadan çekiş.

labels argümanı, scales paketindeki etiketleme fonksiyonlarıyla birlikte, sayıları para birimi, yüzde vb. olarak biçimlendirmek için de kullanışlıdır. Soldaki grafik, bir dolar işareti ve bir binlik ayırıcı virgül ekleyen label_dollar() ile varsayılan etiketlemeyi gösteriyor. Sağdaki grafik, dolar değerlerini 1.000’e bölüp binleri belirtmek için “K” son ekini kullanarak ve özel kesme noktaları ekleyerek daha ileri bir özelleştirme yapıyor. breaks değerlerinin verinin özgün ölçeğinde olduğuna dikkat edin.

# Sol
ggplot(diamonds, aes(x = price, y = cut)) +
  geom_boxplot(alpha = 0.05) +
  scale_x_continuous(labels = label_dollar())

# Sağ
ggplot(diamonds, aes(x = price, y = cut)) +
  geom_boxplot(alpha = 0.05) +
  scale_x_continuous(
    labels = label_dollar(scale = 1/1000, suffix = "K"), 
    breaks = seq(1000, 19000, by = 6000)
  )

Elmasların price'ına karşı cut'ının iki yan yana kutu grafiği. Aykırı değerler saydam. Her iki grafikte de x ekseni etiketleri dolar olarak biçimlendirilmiş. Soldaki grafikteki x ekseni etiketleri $0'da başlayıp $15.000'de biter ve $5.000'er artar. Sağdaki grafikteki x ekseni etiketleri $1K'da başlayıp $19K'da biter ve $6K'şar artar.

Elmasların price'ına karşı cut'ının iki yan yana kutu grafiği. Aykırı değerler saydam. Her iki grafikte de x ekseni etiketleri dolar olarak biçimlendirilmiş. Soldaki grafikteki x ekseni etiketleri $0'da başlayıp $15.000'de biter ve $5.000'er artar. Sağdaki grafikteki x ekseni etiketleri $1K'da başlayıp $19K'da biter ve $6K'şar artar.

Başka bir kullanışlı etiketleme fonksiyonu label_percent()’tir:

ggplot(diamonds, aes(x = cut, fill = clarity)) +
  geom_bar(position = "fill") +
  scale_y_continuous(name = "Yüzde", labels = label_percent())

clarity düzeyleriyle doldurulmuş, cut'ın bölümlere ayrılmış çubuk grafikleri. Y ekseni etiketleri %0'da başlayıp %100'de biter ve %25'er artar. Y ekseni etiket adı "Yüzde"dir.

breaks’in bir başka kullanımı, nispeten az veri noktanız olduğunda ve gözlemlerin tam olarak nerede gerçekleştiğini vurgulamak istediğinizde ortaya çıkar. Örneğin, her ABD başkanının görev süresinin ne zaman başlayıp bittiğini gösteren şu grafiği ele alın.

presidential |>
  mutate(id = 33 + row_number()) |>
  ggplot(aes(x = start, y = id)) +
  geom_point() +
  geom_segment(aes(xend = end, yend = id)) +
  scale_x_date(name = NULL, breaks = presidential$start, date_labels = "'%y")

Başkanların id numarasına karşı başkanlıklarına başladıkları yılın bir çizgi grafiği. Başlangıç yılı bir nokta ile işaretlenmiştir ve orada başlayıp başkanlığın sonunda biten bir segment vardır. X ekseni etiketleri, bir apostrofla başlayan iki basamaklı yıllar olarak biçimlendirilmiştir, örneğin '53.

breaks argümanı için, bu argüman için bir estetik eşleme yapamadığımızdan, start değişkenini presidential$start ile bir vektör olarak çıkardığımıza dikkat edin. Ayrıca tarih ve tarih-saat ölçeklerinde kesme noktalarıyla etiketlerin biraz farklı belirtildiğine dikkat edin:

  • date_labels, parse_datetime() ile aynı sözdizimini kullanan bir biçim belirtimi alır.

  • date_breaks (burada gösterilmemiştir), “2 days” veya “1 month” gibi bir dize alır.

11.4.3 Gösterge yerleşimi

Eksenlerde ince ayar yapmak için çoğunlukla breaks ve labels’i kullanacaksınız. Her ikisi de göstergelerde çalışır; ancak göstergeler için daha sık kullanacağınız birkaç teknik daha vardır.

Göstergenin genel konumunu belirlemek için bir theme() ayarı kullanmanız gerekir. Bölümün sonunda temalara döneceğiz; kısaca söylemek gerekirse temalar, grafiğin veri dışındaki bölümlerini denetler. legend.position tema ayarı, göstergenin nereye çizileceğini belirler:

base <- ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = class))

base + theme(legend.position = "right") # varsayılan
base + theme(legend.position = "left")
base + 
  theme(legend.position = "top") +
  guides(color = guide_legend(nrow = 3))
base + 
  theme(legend.position = "bottom") +
  guides(color = guide_legend(nrow = 3))

Noktaların araç sınıfına göre renklendirildiği, araçların otoyol yakıt verimliliğine karşı motor hacminin dört saçılım grafiği. Saat yönünde, gösterge grafiğin sağına, soluna, altına ve üstüne yerleştirilmiştir.

Noktaların araç sınıfına göre renklendirildiği, araçların otoyol yakıt verimliliğine karşı motor hacminin dört saçılım grafiği. Saat yönünde, gösterge grafiğin sağına, soluna, altına ve üstüne yerleştirilmiştir.

Noktaların araç sınıfına göre renklendirildiği, araçların otoyol yakıt verimliliğine karşı motor hacminin dört saçılım grafiği. Saat yönünde, gösterge grafiğin sağına, soluna, altına ve üstüne yerleştirilmiştir.

Noktaların araç sınıfına göre renklendirildiği, araçların otoyol yakıt verimliliğine karşı motor hacminin dört saçılım grafiği. Saat yönünde, gösterge grafiğin sağına, soluna, altına ve üstüne yerleştirilmiştir.

Grafiğiniz kısa ve genişse göstergeyi üste veya alta; uzun ve darsa sola veya sağa yerleştirin. Göstergeyi tümüyle gizlemek için legend.position = "none" seçeneğini kullanabilirsiniz.

Tek tek göstergelerin görüntülenmesini denetlemek için guides() fonksiyonunu guide_legend() veya guide_colorbar() ile birlikte kullanın. Aşağıdaki örnek iki önemli ayarı gösterir: nrow ile göstergenin kullandığı satır sayısını belirlemek ve noktaları büyütmek için estetiklerden birini geçersiz kılmak. Bu, bir grafikte pek çok noktayı göstermek için düşük bir alpha kullandıysanız özellikle kullanışlıdır.

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = class)) +
  geom_smooth(se = FALSE) +
  theme(legend.position = "bottom") +
  guides(color = guide_legend(nrow = 2, override.aes = list(size = 4)))
#> `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Noktaların araç sınıfına göre renklendirildiği, araçların otoyol yakıt verimliliğine karşı motor hacminin bir saçılım grafiği. Grafiğin üzerine düzgün bir eğri bindirilmiştir. Gösterge altta ve sınıflar yatay olarak iki satırda listelenmiştir. Göstergedeki noktalar, grafikteki noktalardan daha büyüktür.

guides()’teki argümanın adının, tıpkı labs()’te olduğu gibi, estetiğin adıyla eşleştiğine dikkat edin.

11.4.4 Bir ölçeği değiştirmek

Ayrıntılarda ince ayar yapmak yerine ölçeği tümüyle değiştirebilirsiniz. Değiştirmek isteyebileceğiniz iki ölçek türü vardır: sürekli konum ölçekleri ve renk ölçekleri. Neyse ki aynı ilkeler diğer tüm estetikler için de geçerlidir; dolayısıyla konum ve renk ölçeklerini öğrendikten sonra diğer ölçek değişikliklerini de hızla kavrayabilirsiniz.

Değişkeninizin dönüşümlerini çizmek çok kullanışlıdır. Örneğin, carat ve price’ı logaritmik olarak dönüştürürsek, aralarındaki kesin ilişkiyi görmek daha kolaydır:

# Sol
ggplot(diamonds, aes(x = carat, y = price)) +
  geom_bin2d()
#> `stat_bin2d()` using `bins = 30`. Pick better value `binwidth`.

# Sağ
ggplot(diamonds, aes(x = log10(carat), y = log10(price))) +
  geom_bin2d()
#> `stat_bin2d()` using `bins = 30`. Pick better value `binwidth`.

Elmasların carat'ına karşı price'ının iki grafiği. Veri kutulanmış ve dikdörtgenlerin rengi, o aralığa düşen nokta sayısını temsil ediyor. Sağdaki grafikte, price ve carat değerlerinin logaritmik alınmış ve eksen etiketleri logaritmik değerleri gösteriyor.

Elmasların carat'ına karşı price'ının iki grafiği. Veri kutulanmış ve dikdörtgenlerin rengi, o aralığa düşen nokta sayısını temsil ediyor. Sağdaki grafikte, price ve carat değerlerinin logaritmik alınmış ve eksen etiketleri logaritmik değerleri gösteriyor.

Ancak, bu dönüşümün dezavantajı, eksenlerin artık dönüştürülmüş değerlerle etiketlenmesi ve bu da grafiği yorumlamayı zorlaştırmasıdır. Dönüşümü estetik eşlemede yapmak yerine ölçek üzerinde uygulayabiliriz. Eksenlerin verinin özgün ölçeğinde etiketlenmesi dışında sonuç görsel olarak aynıdır.

ggplot(diamonds, aes(x = carat, y = price)) +
  geom_bin2d() + 
  scale_x_log10() + 
  scale_y_log10()
#> `stat_bin2d()` using `bins = 30`. Pick better value `binwidth`.

Elmasların carat'ına karşı price'ının bir grafiği. Veri kutulanmış ve dikdörtgenlerin rengi, o aralığa düşen nokta sayısını temsil ediyor. Eksen etiketleri verinin özgün ölçeğinde.

Sık özelleştirilen bir başka ölçek de renktir. Varsayılan kategorik ölçek, renk çemberi üzerinde eşit aralıklarla yer alan renkleri seçer. Yaygın renk görme bozukluklarında daha iyi çalışacak biçimde elle ayarlanmış ColorBrewer ölçekleri kullanışlı alternatiflerdir. Aşağıdaki iki grafik benzer görünüyor; ama kırmızı ve yeşil tonlarında, sağdaki noktaların kırmızı-yeşil renk körlüğü olan insanlar tarafından bile ayırt edilebileceği kadar fark var.1

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

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = drv)) +
  scale_color_brewer(palette = "Set1")

Noktaların tahrik türüne göre renklendirildiği, otoyol yakıt verimliliğine karşı motor hacminin iki saçılım grafiği. Soldaki grafik varsayılan ggplot2 renk paletini kullanıyor, sağdaki grafik ise farklı bir renk paleti kullanıyor.

Noktaların tahrik türüne göre renklendirildiği, otoyol yakıt verimliliğine karşı motor hacminin iki saçılım grafiği. Soldaki grafik varsayılan ggplot2 renk paletini kullanıyor, sağdaki grafik ise farklı bir renk paleti kullanıyor.

Erişilebilirliği artırmak için daha basit teknikleri unutmayın. Yalnızca birkaç renk varsa, aynı bilgiyi yeniden kodlayan bir şekil eşlemesi ekleyebilirsiniz. Bu, grafiğinizin siyah beyaz olarak da yorumlanabilir olmasını sağlamaya yardımcı olacaktır.

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = drv, shape = drv)) +
  scale_color_brewer(palette = "Set1")

Noktaların hem renginin hem de şeklinin tahrik türüne dayandığı, otoyol yakıt verimliliğine karşı motor hacminin bir saçılım grafiği. Renk paleti varsayılan ggplot2 paleti değil.

ColorBrewer ölçekleri https://colorbrewer2.org/ adresinde belgelenmiştir ve Erich Neuwirth’in RColorBrewer paketi aracılığıyla R’da kullanılabilir. Şekil 11.1, tüm paletlerin eksiksiz listesini gösterir. Sıralı (sequential; üstteki) ve ayrışan (diverging; alttaki) paletler, kategorik değerleriniz sıralıysa veya anlamlı bir “orta” noktası varsa özellikle kullanışlıdır. Bu genellikle, sürekli bir değişkeni kategorik bir değişkene dönüştürmek için cut() kullandıysanız ortaya çıkar.

Tüm ColorBrewer ölçekleri. Bir grup açık renklerden koyu renklere gidiyor. Başka bir grup, sırasız (non ordinal) bir renk kümesi. Son grup ise ayrışan ölçeklere sahip (koyudan açığa, yeniden koyuya). Her kümenin içinde bir dizi palet var.
Şekil 11.1: Tüm ColorBrewer ölçekleri.

Değerler ile renkler arasında önceden tanımlanmış bir eşleme varsa, scale_color_manual()’ı kullanın. Örneğin, başkanlık partisini renge eşlersek, Cumhuriyetçiler için kırmızı ve Demokratlar için mavi olan standart eşlemeyi kullanmak isteriz. Bu renkleri atamanın bir yaklaşımı, hex renk kodları kullanmaktır:

presidential |>
  mutate(id = 33 + row_number()) |>
  ggplot(aes(x = start, y = id, color = party)) +
  geom_point() +
  geom_segment(aes(xend = end, yend = id)) +
  scale_color_manual(values = c(Republican = "#E81B23", Democratic = "#00AEF3"))

Başkanların id numarasına karşı başkanlıklarına başladıkları yılın bir çizgi grafiği. Başlangıç yılı bir nokta ile işaretlenmiştir ve orada başlayıp başkanlığın sonunda biten bir segment vardır. Demokrat başkanlar mavi, Cumhuriyetçiler ise kırmızı ile temsil edilir.

Sürekli renkler için yerleşik scale_color_gradient() veya scale_fill_gradient() fonksiyonunu kullanabilirsiniz. Ayrışan bir ölçeğiniz varsa scale_color_gradient2() fonksiyonunu kullanabilirsiniz. Bu, örneğin, pozitif ve negatif değerlere farklı renkler vermenizi sağlar. Bu, ortalamanın üzerindeki veya altındaki noktaları ayırt etmek istediğinizde de bazen kullanışlıdır.

Başka bir seçenek viridis renk ölçeklerini kullanmaktır. Tasarımcılar Nathaniel Smith ve Stéfan van der Walt, çeşitli renk körlüğü biçimlerine sahip insanlar tarafından algılanabilen ve hem renkte hem de siyah beyazda algısal olarak tekdüze olan sürekli renk şemalarını dikkatlice hazırladılar. Bu ölçekler ggplot2’de sürekli (c), kesikli (d) ve aralıklara ayrılmış (b) paletler olarak bulunur.

df <- tibble(
  x = rnorm(10000),
  y = rnorm(10000)
)

ggplot(df, aes(x, y)) +
  geom_hex() +
  coord_fixed() +
  labs(title = "Varsayılan, sürekli", x = NULL, y = NULL)

ggplot(df, aes(x, y)) +
  geom_hex() +
  coord_fixed() +
  scale_fill_viridis_c() +
  labs(title = "Viridis, sürekli", x = NULL, y = NULL)

ggplot(df, aes(x, y)) +
  geom_hex() +
  coord_fixed() +
  scale_fill_viridis_b() +
  labs(title = "Viridis, aralıklı", x = NULL, y = NULL)

Altıgenlerin renginin, o altıgen aralığa düşen gözlem sayısını gösterdiği üç altıgen grafik. İlk grafik varsayılan sürekli ggplot2 ölçeğini kullanıyor. İkinci grafik sürekli, üçüncü grafik ise aralıklara ayrılmış viridis ölçeğini kullanıyor.

Altıgenlerin renginin, o altıgen aralığa düşen gözlem sayısını gösterdiği üç altıgen grafik. İlk grafik varsayılan sürekli ggplot2 ölçeğini kullanıyor. İkinci grafik sürekli, üçüncü grafik ise aralıklara ayrılmış viridis ölçeğini kullanıyor.

Altıgenlerin renginin, o altıgen aralığa düşen gözlem sayısını gösterdiği üç altıgen grafik. İlk grafik varsayılan sürekli ggplot2 ölçeğini kullanıyor. İkinci grafik sürekli, üçüncü grafik ise aralıklara ayrılmış viridis ölçeğini kullanıyor.

Tüm renk ölçeklerinin iki çeşidi olduğuna dikkat edin: sırasıyla color ve fill estetikleri için scale_color_*() ile scale_fill_*() (renk ölçekleri hem İngiliz hem de Amerikan yazımlarıyla kullanılabilir).

11.4.5 Yakınlaştırma

Grafik sınırlarını kontrol etmenin üç yolu vardır:

  1. Hangi verinin çizildiğini ayarlamak.
  2. Her ölçekteki sınırları ayarlamak.
  3. coord_cartesian() içinde xlim ve ylim’i ayarlamak.

Bu seçenekleri bir dizi grafikte göstereceğiz. Soldaki grafik, tahrik sistemi türüne göre renklendirilmiş, motor hacmi ile yakıt verimliliği arasındaki ilişkiyi gösteriyor. Sağdaki grafik aynı değişkenleri gösteriyor; ama çizilen veriyi alt kümeliyor. Veriyi alt kümeye ayırmak, pürüzsüz eğrinin yanı sıra x ve y ölçeklerini de etkiledi.

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

# Sağ
mpg |>
  filter(displ >= 5 & displ <= 6 & hwy >= 10 & hwy <= 25) |>
  ggplot(aes(x = displ, y = hwy)) +
  geom_point(aes(color = drv)) +
  geom_smooth()

Solda, noktaların tahrik türüne göre renklendirildiği, otoyol yakıt verimliliğinin motor hacmine karşı bir saçılım grafiği. Üzerine bindirilen düzgün eğri, hokey sopası gibi önce azalan sonra artan bir eğilim gösteriyor. Sağda, aynı değişkenler yalnızca 5 ile 6 arasında değişen motor hacmi ve yalnızca 10 ile 25 arasında değişen otoyol yakıt verimliliğiyle çizilmiş. Üzerine bindirilen düzgün eğri, önce hafifçe artan sonra azalan bir eğilim gösteriyor.

Solda, noktaların tahrik türüne göre renklendirildiği, otoyol yakıt verimliliğinin motor hacmine karşı bir saçılım grafiği. Üzerine bindirilen düzgün eğri, hokey sopası gibi önce azalan sonra artan bir eğilim gösteriyor. Sağda, aynı değişkenler yalnızca 5 ile 6 arasında değişen motor hacmi ve yalnızca 10 ile 25 arasında değişen otoyol yakıt verimliliğiyle çizilmiş. Üzerine bindirilen düzgün eğri, önce hafifçe artan sonra azalan bir eğilim gösteriyor.

Bunları, soldaki grafiğin tek tek ölçeklerde limits değerini; sağdaki grafiğin ise coord_cartesian() içindeki sınırları ayarladığı aşağıdaki iki grafikle karşılaştıralım. Sınırları azaltmanın veriyi alt kümelemeye eşdeğer olduğunu görebiliriz. Bu nedenle, grafiğin bir bölgesine yakınlaşmak için genellikle coord_cartesian()’ı kullanmak en iyisidir.

# Sol
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = drv)) +
  geom_smooth() +
  scale_x_continuous(limits = c(5, 6)) +
  scale_y_continuous(limits = c(10, 25))

# Sağ
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(aes(color = drv)) +
  geom_smooth() +
  coord_cartesian(xlim = c(5, 6), ylim = c(10, 25))

Solda, motor hacmi 5 ile 6 arasında ve otoyol yakıt verimliliği 10 ile 25 arasında değişen, otoyol yakıt verimliliğinin motor hacmine karşı bir saçılım grafiği. Üzerine bindirilen düzgün eğri, önce hafifçe artan sonra azalan bir eğilim gösteriyor. Sağda, aynı değişkenler aynı sınırlarla çizilmiş; ancak üzerine bindirilen düzgün eğri, sonunda hafif bir artışla birlikte nispeten düz bir eğilim gösteriyor.

Solda, motor hacmi 5 ile 6 arasında ve otoyol yakıt verimliliği 10 ile 25 arasında değişen, otoyol yakıt verimliliğinin motor hacmine karşı bir saçılım grafiği. Üzerine bindirilen düzgün eğri, önce hafifçe artan sonra azalan bir eğilim gösteriyor. Sağda, aynı değişkenler aynı sınırlarla çizilmiş; ancak üzerine bindirilen düzgün eğri, sonunda hafif bir artışla birlikte nispeten düz bir eğilim gösteriyor.

Öte yandan tek tek ölçeklerde limits ayarlamak, örneğin farklı grafiklerin ölçeklerini eşleştirmek üzere sınırları genişletmek istediğinizde daha kullanışlıdır. Örneğin iki araç sınıfını ayırıp ayrı ayrı çizersek üç ölçeğin de (x ekseni, y ekseni ve color estetiği) farklı aralıklara sahip olması, grafikleri karşılaştırmayı zorlaştırır.

suv <- mpg |> filter(class == "suv")
compact <- mpg |> filter(class == "compact")

# Sol
ggplot(suv, aes(x = displ, y = hwy, color = drv)) +
  geom_point()

# Sağ
ggplot(compact, aes(x = displ, y = hwy, color = drv)) +
  geom_point()

Solda, SUV'ların motor hacmine karşı otoyol yakıt verimliliğinin bir saçılım grafiği. Sağda, compact araçlar için aynı değişkenlerin bir saçılım grafiği. Her iki grafikte de noktalar tahrik türüne göre renklendirilmiştir. SUV'lar arasında araçların çoğu 4 çeker ve diğerleri arka çekiş, compact araçlar arasında ise araçların çoğu ön çekiş ve diğerleri 4 çeker. SUV grafiği, otoyol yakıt verimliliği ile motor hacmi arasında belirgin bir negatif ilişki gösterirken, compact araçlar grafiğinde ilişki çok daha düz.

Solda, SUV'ların motor hacmine karşı otoyol yakıt verimliliğinin bir saçılım grafiği. Sağda, compact araçlar için aynı değişkenlerin bir saçılım grafiği. Her iki grafikte de noktalar tahrik türüne göre renklendirilmiştir. SUV'lar arasında araçların çoğu 4 çeker ve diğerleri arka çekiş, compact araçlar arasında ise araçların çoğu ön çekiş ve diğerleri 4 çeker. SUV grafiği, otoyol yakıt verimliliği ile motor hacmi arasında belirgin bir negatif ilişki gösterirken, compact araçlar grafiğinde ilişki çok daha düz.

Bu sorunu aşmanın bir yolu, ölçekleri tüm verinin limits değerleriyle eğiterek birden fazla grafik arasında paylaşmaktır.

x_scale <- scale_x_continuous(limits = range(mpg$displ))
y_scale <- scale_y_continuous(limits = range(mpg$hwy))
col_scale <- scale_color_discrete(limits = unique(mpg$drv))

# Sol
ggplot(suv, aes(x = displ, y = hwy, color = drv)) +
  geom_point() +
  x_scale +
  y_scale +
  col_scale

# Sağ
ggplot(compact, aes(x = displ, y = hwy, color = drv)) +
  geom_point() +
  x_scale +
  y_scale +
  col_scale

Solda, SUV'ların motor hacmine karşı otoyol yakıt verimliliğinin bir saçılım grafiği. Sağda, compact araçlar için aynı değişkenlerin bir saçılım grafiği. Her iki grafikte de noktalar tahrik türüne göre renklendirilmiştir. Her iki grafik de otoyol yakıt verimliliği, motor hacmi ve tahrik türü için aynı ölçekte çizilmiştir; bu da ön çekişli SUV veya arka çekişli compact araç olmamasına rağmen göstergenin her iki grafik için de üç türü de (önden çekiş, arkadan çekiş ve dört çeker) göstermesiyle sonuçlanır. X ve y ölçekleri aynı olduğundan ve en düşük ya da en yüksek otoyol yakıt verimliliği ile motor hacminin çok ötesine gittiğinden, noktalar tüm çizim alanını kaplamaz.

Solda, SUV'ların motor hacmine karşı otoyol yakıt verimliliğinin bir saçılım grafiği. Sağda, compact araçlar için aynı değişkenlerin bir saçılım grafiği. Her iki grafikte de noktalar tahrik türüne göre renklendirilmiştir. Her iki grafik de otoyol yakıt verimliliği, motor hacmi ve tahrik türü için aynı ölçekte çizilmiştir; bu da ön çekişli SUV veya arka çekişli compact araç olmamasına rağmen göstergenin her iki grafik için de üç türü de (önden çekiş, arkadan çekiş ve dört çeker) göstermesiyle sonuçlanır. X ve y ölçekleri aynı olduğundan ve en düşük ya da en yüksek otoyol yakıt verimliliği ile motor hacminin çok ötesine gittiğinden, noktalar tüm çizim alanını kaplamaz.

Bu özel durumda yalnızca panelleme kullanabilirdiniz; ancak bu teknik, örneğin grafikleri bir raporun birden çok sayfasına yaymak istediğinizde daha genel bir çözüm sunar.

11.4.6 Alıştırmalar

  1. Aşağıdaki kod varsayılan ölçeği neden değiştirmiyor?

    df <- tibble(
      x = rnorm(10000),
      y = rnorm(10000)
    )
    
    ggplot(df, aes(x, y)) +
      geom_hex() +
      scale_color_gradient(low = "white", high = "red") +
      coord_fixed()
  2. Her ölçeğin ilk argümanı nedir? Bu, labs() ile nasıl karşılaştırılır?

  3. Başkanlık dönemlerinin görüntüsünü şu şekilde değiştirin:

    1. Renkleri ve x ekseni kesme noktalarını özelleştiren iki varyantı birleştirerek.
    2. Y ekseninin görüntüsünü iyileştirerek.
    3. Her dönemi başkanın adıyla etiketleyerek.
    4. Bilgilendirici grafik etiketleri ekleyerek.
    5. Break’leri her 4 yılda bir yerleştirerek (bu göründüğünden daha zor!).
  4. Önce, aşağıdaki grafiği oluşturun. Ardından göstergeyi daha kolay okunur kılmak için override.aes kullanarak kodu değiştirin.

    ggplot(diamonds, aes(x = carat, y = price)) +
      geom_point(aes(color = cut), alpha = 1/20)

11.5 Temalar

Son olarak, bir tema ile grafiğinizin veri olmayan öğelerini özelleştirebilirsiniz:

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

Araçların otoyol yakıt verimliliğinin motor hacmine karşı, araç sınıfına göre renklendirilmiş bir saçılım grafiği. Grafik arka planı beyaz, gri ızgara çizgileriyle.

ggplot2, varsayılan olarak theme_gray() ile birlikte Şekil 11.2 içinde gösterilen sekiz tema içerir.2 Jeffrey Arnold’un ggthemes (https://jrnold.github.io/ggthemes) gibi eklenti paketlerinde çok daha fazlası bulunur. Belirli bir kurumsal veya dergi stiline uymaya çalışıyorsanız, kendi temalarınızı da oluşturabilirsiniz.

ggplot2 ile oluşturulmuş, her biri sekiz yerleşik temadan birine sahip sekiz çubuk grafiği: theme_bw() - ızgara çizgileriyle beyaz arka plan, theme_light() - hafif eksenler ve ızgara çizgileri, theme_classic() - klasik tema, eksenler var ama ızgara çizgisi yok, theme_linedraw() - yalnızca siyah çizgiler, theme_dark() - kontrast için koyu arka plan, theme_minimal() - minimal tema, arka plan yok, theme_gray() - gri arka plan (varsayılan tema), theme_void() - boş tema, yalnızca geom'lar görünür.
Şekil 11.2: ggplot2’ye yerleşik sekiz tema.

Her temanın, y eksenindeki yazı tipinin boyutu ve rengi gibi tek tek bileşenlerini denetlemek de mümkündür. legend.position seçeneğinin göstergenin nereye çizileceğini belirlediğini zaten gördük. Göstergenin theme() ile özelleştirilebilecek daha pek çok yönü vardır. Örneğin aşağıdaki grafikte göstergenin yönünü değiştiriyor ve çevresine siyah bir kenarlık ekliyoruz. Temanın gösterge ve grafik başlığı öğelerinin element_*() fonksiyonlarıyla özelleştirildiğine dikkat edin. Bu fonksiyonlar veri dışı bileşenlerin stilini belirtir; örneğin başlık metni element_text() fonksiyonunun face argümanıyla kalınlaştırılır, gösterge kenarlığının rengi ise element_rect() fonksiyonunun color argümanıyla tanımlanır. Başlığın ve altyazının konumunu kontrol eden tema öğeleri sırasıyla plot.title.position ve plot.caption.position’dır. Aşağıdaki grafikte bunlar, bu öğelerin (varsayılan olan) grafik panelinin yerine tüm grafik alanına hizalandığını belirtmek için "plot" olarak ayarlanmıştır. Başlık ve altyazı metninin biçimi için yerleşimini değiştirmek üzere kullanılan birkaç yardımcı theme() bileşeni daha vardır.

ggplot(mpg, aes(x = displ, y = hwy, color = drv)) +
  geom_point() +
  labs(
    title = "Motor büyüdükçe yakıt verimliliği düşme eğilimindedir",
    caption = "Kaynak: https://fueleconomy.gov."
  ) +
  theme(
    legend.position = c(0.6, 0.7),
    legend.direction = "horizontal",
    legend.box.background = element_rect(color = "black"),
    plot.title = element_text(face = "bold"),
    plot.title.position = "plot",
    plot.caption.position = "plot",
    plot.caption = element_text(hjust = 0)
  )

Araçların otoyol yakıt verimliliğine karşı motor hacminin, çekiş sistemine göre renklendirilmiş bir saçılım grafiği. Grafiğin başlığı "Motor büyüdükçe yakıt verimliliği genellikle düşer"dir ve altyazı, verinin kaynağı olan fueleconomy.gov'a işaret eder. Alt yazı ve başlık sola hizalanmıştır, gösterge siyah kenarlıkla grafiğin içindedir.

Tüm theme() bileşenlerine genel bir bakış için, ?theme yardımına bakın. ggplot2 kitabı da tema oluşturmanın tüm ayrıntıları için gidilecek harika bir yerdir.

11.5.1 Alıştırmalar

  1. ggthemes paketinin sunduğu bir tema seçin ve onu yaptığınız son grafiğe uygulayın.
  2. Grafiğinizin eksen etiketlerini mavi ve kalın yapın.

11.6 Yerleşim

Şimdiye kadar tek bir grafiği nasıl oluşturup değiştireceğinizden bahsettik. Peki belirli bir şekilde yerleştirmek istediğiniz birden fazla grafiğiniz varsa ne olur? patchwork paketi, ayrı grafikleri aynı grafik içinde birleştirmenizi sağlar. Bu paketi bölümün başında yüklemiştik.

İki grafiği yan yana yerleştirmek için, onları basitçe birbirine ekleyebilirsiniz. Önce grafikleri oluşturmanız ve onları nesneler olarak kaydetmeniz gerektiğine dikkat edin (aşağıdaki örnekte p1 ve p2 olarak adlandırılıyorlar). Ardından, onları + ile yan yana yerleştirirsiniz.

p1 <- ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point() + 
  labs(title = "Grafik 1")
p2 <- ggplot(mpg, aes(x = drv, y = hwy)) + 
  geom_boxplot() + 
  labs(title = "Grafik 2")
p1 + p2

Yan yana yerleştirilmiş iki grafik (otoyol yakıt verimliliğinin motor hacmine karşı bir saçılım grafiği ve otoyol yakıt verimliliğinin tahrik sistemine karşı yan yana kutu grafikleri).

Yukarıdaki kod parçasında patchwork paketinden yeni bir fonksiyon kullanmadığımıza dikkat etmek önemlidir. Bunun yerine, paket + operatörüne yeni bir işlevsellik ekledi.

patchwork ile karmaşık grafik yerleşimleri de oluşturabilirsiniz. Aşağıda, |, p1 ve p3’ü yan yana yerleştirir ve /, p2’yi bir sonraki satıra taşır.

p3 <- ggplot(mpg, aes(x = cty, y = hwy)) + 
  geom_point() + 
  labs(title = "Grafik 3")
(p1 | p3) / p2

İlk ve üçüncü grafiğin yan yana olduğu ve ikinci grafiğin bunların altına yayıldığı şekilde yerleştirilmiş üç grafik. İlk grafik, otoyol yakıt verimliliğinin motor hacmine karşı bir saçılım grafiği, üçüncü grafik, otoyol yakıt verimliliğinin şehir içi yakıt verimliliğine karşı bir saçılım grafiği ve ikinci grafik, otoyol yakıt verimliliğinin tahrik sistemine karşı yan yana kutu grafikleridir.

Ayrıca patchwork, birden fazla grafikteki göstergeleri tek bir ortak göstergede toplamanıza, göstergenin yerleşimini ve grafiklerin boyutlarını özelleştirmenize, grafiklere ortak bir başlık, alt başlık, alt yazı vb. eklemenize olanak tanır. Aşağıda 5 grafik oluşturuyoruz. Kutu ve saçılım grafiklerindeki göstergeleri kapattık; & theme(legend.position = "top") ile yoğunluk grafiklerinin göstergelerini grafiğin üstünde topladık. Burada her zamanki + yerine & operatörünün kullanımına dikkat edin. Bunun nedeni, tek tek ggplot’lar yerine patchwork grafiği için temayı değiştiriyor olmamızdır. Gösterge üstteki guide_area() alanına yerleştirilmiştir. Son olarak patchwork düzenindeki bileşenlerin yüksekliklerini de özelleştirdik: kılavuz alanının yüksekliği 1, kutu grafiklerinin 3, yoğunluk grafiklerinin 2 ve panellere ayrılmış saçılım grafiğinin 4’tür. Patchwork, grafik için ayırdığınız alanı bu oranlara göre böler ve bileşenleri buna göre yerleştirir.

p1 <- ggplot(mpg, aes(x = drv, y = cty, color = drv)) + 
  geom_boxplot(show.legend = FALSE) + 
  labs(title = "Grafik 1")

p2 <- ggplot(mpg, aes(x = drv, y = hwy, color = drv)) + 
  geom_boxplot(show.legend = FALSE) + 
  labs(title = "Grafik 2")

p3 <- ggplot(mpg, aes(x = cty, color = drv, fill = drv)) + 
  geom_density(alpha = 0.5) + 
  labs(title = "Grafik 3")

p4 <- ggplot(mpg, aes(x = hwy, color = drv, fill = drv)) + 
  geom_density(alpha = 0.5) + 
  labs(title = "Grafik 4")

p5 <- ggplot(mpg, aes(x = cty, y = hwy, color = drv)) + 
  geom_point(show.legend = FALSE) + 
  facet_wrap(~drv) +
  labs(title = "Grafik 5")

(guide_area() / (p1 + p2) / (p3 + p4) / p5) +
  plot_annotation(
    title = "Farklı tahrik sistemlerine sahip araçlarda şehir içi ve otoyol yakıt verimliliği",
    caption = "Kaynak: https://fueleconomy.gov."
  ) +
  plot_layout(
    guides = "collect",
    heights = c(1, 3, 2, 4)
    ) &
  theme(legend.position = "top")

İlk iki grafiğin yan yana olduğu şekilde yerleştirilmiş beş grafik. Üçüncü ve dördüncü grafikler bunların altında. Ve beşinci grafik bunların altına yayılıyor. Birleştirilmiş grafiğin başlığı "Farklı tahrik sistemlerine sahip araçlarda şehir içi ve otoyol yakıt verimliliği", alt yazısı ise "Kaynak: https://fueleconomy.gov sitesidir. İlk iki grafik yan yana kutu grafikleridir. 3. ve 4. grafikler yoğunluk grafikleridir. Beşinci grafik ise panellere ayrılmış bir saçılım grafiğidir. Bu grafiklerin her biri tahrik türüne göre renklendirilmiş geom'lar gösterir; ancak birleştirilmiş grafiğin, grafiklerin üstünde ve başlığın altında, hepsine uygulanan tek bir göstergesi vardır.

patchwork ile birden fazla grafiği birleştirme ve yerleştirme hakkında daha fazla bilgi edinmek isterseniz, paketin web sitesindeki kılavuzlara göz atmanızı öneririz: https://patchwork.data-imaginist.com.

11.6.1 Alıştırmalar

  1. Aşağıdaki grafik yerleşiminde parantezleri çıkarırsanız ne olur? Bunun neden olduğunu açıklayabilir misiniz?

    p1 <- ggplot(mpg, aes(x = displ, y = hwy)) + 
      geom_point() + 
      labs(title = "Grafik 1")
    p2 <- ggplot(mpg, aes(x = drv, y = hwy)) + 
      geom_boxplot() + 
      labs(title = "Grafik 2")
    p3 <- ggplot(mpg, aes(x = cty, y = hwy)) + 
      geom_point() + 
      labs(title = "Grafik 3")
    
    (p1 | p2) / p3
  2. Önceki alıştırmadaki üç grafiği kullanarak, aşağıdaki patchwork’ü yeniden oluşturun.

    Üç grafik: Grafik 1, otoyol yakıt verimliliğinin motor hacmine karşı bir saçılım grafiğidir. Grafik 2, otoyol yakıt verimliliğinin tahrik sistemine karşı yan yana kutu grafikleridir. Grafik 3, şehir içi yakıt verimliliğinin tahrik sistemine karşı yan yana kutu grafikleridir. Grafik 1 ilk satırda. Grafik 2 ve 3 bir sonraki satırda, her biri Grafik 1'in genişliğinin yarısını kaplıyor. Grafik 1 "Şek. A", Grafik 2 "Şek. B", Grafik 3 ise "Şek. C" olarak etiketlenmiştir.

11.7 Özet

Bu bölümde title, subtitle ve caption gibi grafik etiketleri eklemenin yanı sıra varsayılan eksen etiketlerini değiştirmeyi; grafiğe bilgilendirici metin eklemek ya da belirli veri noktalarını vurgulamak için açıklama notları kullanmayı; eksen ölçeklerini ve grafiğin temasını özelleştirmeyi öğrendiniz. Ayrıca hem basit hem de karmaşık grafik yerleşimleri kullanarak birden fazla grafiği tek bir grafikte birleştirmeyi de öğrendiniz.

Şimdiye kadar pek çok farklı grafik türünü nasıl yapacağınızı ve çeşitli tekniklerle onları nasıl özelleştireceğinizi öğrenmiş olsanız da, ggplot2 ile oluşturabileceklerinizin yüzeyini henüz zar zor kazıdık. ggplot2 hakkında kapsamlı bir anlayış edinmek isterseniz, ggplot2: Elegant Graphics for Data Analysis kitabını okumanızı öneririz. Winston Chang’in R Graphics Cookbook ve Claus Wilke’nin Fundamentals of Data Visualization kitapları da yararlı kaynaklardır.


  1. Bu görüntüleri test etmek için renk körlüğünü simüle etmek üzere SimDaltonism gibi bir araç kullanabilirsiniz.↩︎

  2. Pek çok kişi, varsayılan temanın neden gri bir arka plana sahip olduğunu merak eder. Bu, veriyi öne çıkarırken ızgara çizgilerini de görünür kılmak için bilinçli bir seçimdi. Beyaz ızgara çizgileri görünürdür (bu önemlidir; çünkü konum değerlendirmelerine önemli ölçüde yardımcı olurlar); ama görsel etkileri azdır ve onları kolayca göz ardı edebiliriz. Gri arka plan, grafiğe metinle benzer bir tipografik renk verir ve grafiklerin parlak beyaz bir arka planla göze batmadan bir belgenin akışına uymasını sağlar. Son olarak, gri arka plan, grafiğin tek bir görsel bütün olarak algılanmasını sağlayan sürekli bir renk alanı oluşturur.↩︎