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"
)
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:

11.2.1 Alıştırmalar
Özelleştirilmiş
title,subtitle,caption,x,yvecoloretiketleriyle yakıt verimliliği verisi üzerinde bir grafik oluşturun.-
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.

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'
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'
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"
)
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()vegeom_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,ymaxestetikleriyle tanımlanır. Alternatif olarak, nokta alt kümelerini dışbükey zarflarla (hulls) belirtmenizi sağlayan ggforce paketine, özellikle degeom_mark_hull()fonksiyonuna bakın.Bir noktaya bir okla dikkat çekmek için
arrowargümanıylageom_segment()’i kullanın. Başlangıç konumunu tanımlamak içinxveyestetiklerini, bitiş konumunu tanımlamak için isexendveyendestetiklerini 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.

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
Grafiğin dört köşesine metin yerleştirmek için sonsuz konumlarla
geom_text()’i kullanın.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.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.)geom_label()’e hangi argümanlar arka plan kutusunun görünümünü kontrol eder?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)) 
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ş"))
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)
)

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())
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")
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))



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'
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`.

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`.
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")

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")
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.
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"))
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)


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:
- Hangi verinin çizildiğini ayarlamak.
- Her ölçekteki sınırları ayarlamak.
-
coord_cartesian()içindexlimveylim’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()

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))

Ö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()

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

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
-
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() Her ölçeğin ilk argümanı nedir? Bu,
labs()ile nasıl karşılaştırılır?-
Başkanlık dönemlerinin görüntüsünü şu şekilde değiştirin:
- Renkleri ve x ekseni kesme noktalarını özelleştiren iki varyantı birleştirerek.
- Y ekseninin görüntüsünü iyileştirerek.
- Her dönemi başkanın adıyla etiketleyerek.
- Bilgilendirici grafik etiketleri ekleyerek.
- Break’leri her 4 yılda bir yerleştirerek (bu göründüğünden daha zor!).
-
Önce, aşağıdaki grafiği oluşturun. Ardından göstergeyi daha kolay okunur kılmak için
override.aeskullanarak 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()
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.
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)
)
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
- ggthemes paketinin sunduğu bir tema seçin ve onu yaptığınız son grafiğe uygulayın.
- 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
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
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")
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
-
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 -
Önceki alıştırmadaki üç grafiği kullanarak, aşağıdaki patchwork’ü yeniden oluşturun.

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.
Bu görüntüleri test etmek için renk körlüğünü simüle etmek üzere SimDaltonism gibi bir araç kullanabilirsiniz.↩︎
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.↩︎