ggplot2 ile şık grafikler

Share on:

Bu yazıda Hadley Wickham’ın ggplot2 paketiyle grafik çiziminden bahsedeceğim. ggplot2’nin bütün yönleriyle anlatımı koca bir kitaba ancak sığar. Wickham’ın ggplot2: Elegant Graphics for Data Analysis kitabı github.com’dan ücretsiz temin edilebilir. Teknik kitapların iyi tarafı mükemmel bir yabancı dil gerektirmemesi. Biraz İngilizce biliyorsanız ve R kodunu okuyabiliyorsanız kitabın faydalı olacağına inanıyorum.

ggplot2 için öncelikle install.packages("ggplot2") komutuyla paketi indirmeniz ve yüklemeniz gerekmekte.

Grafik nesneleri katmanlardan ibarettir. R sistemindeki standart grafik araçlarıyla bunu bir nebze görebiliriz. Hatırlarsanız grafik ortamını ayarladıktan sonra koordinat düzlemini, değişkenleri, başlık, etiket gibi görsel ögeleri ilave katmanlar halinde grafiğe ekleyebiliyorduk. ggplot2’yi kullanırken bu katmanlı yapıyı daha net görebiliyoruz. Görsel ögeleri içeren katmanlara ggplot2’de geom ismini vermekteyiz. Ne tür bir grafik istediğimizi geom katmanıyla belirtmekteyiz. Herbir geom’un kendisine has estetik (kısaca aes()) fonksiyonu bulunmaktadır. Estetik özellikler plotun tamamı için topluca tanımlanabileceği gibi herbir geom için ayrı ayrı da tanımlanabilir. Aşağıdaki listede sık kullanılan geomlar bulunmaktadır:

  • geom_bar(): Çubuk grafiği çizer.
  • geom_point(): Dağılım grafiğinde olduğu gibi gözlemlerin nokta veya şekillerle ifade edildiği nokta grafiği çizer.
  • geom_line(): Gözlemlerin çizgilerle birleştirildiği çizgi grafiği çizer.
  • geom_smooth(): Regresyon çizgisi gibi, verideki trendi özetlemeyi sağlar.*
  • geom_histogram(): Histogram grafiği çizer.
  • geom_boxplot(): Kutu grafiği çizer.
  • geom_text(): Metin eklememizi sağlar.
  • geom_density(): Yoğunluk grafiği çizer.

Haliyle bunların dışında birçok geom bulunmaktadır. Her geom farklı estetik ögeler almaktadır. Bu sebeple ggplot2 paketini yükledikten sonra yardım dosyalarına mutlaka göz atmalısınız.

Herbir geom, grafiği çizebilmek için veride bir kısım hesaplamalar yapmaktadır. Mesela çubuk grafiği verilen değişkenin sayısını hesaplamaktadır. geomların bu standart özelliklerini stat fonksiyonuyla değiştirebiliriz. Bu şekilde mesela histogram grafiğinin sayı değil de yoğunluk (density) hesaplaması yapmasını sağlayabiliriz. Herbir geom’un stat fonksiyonu da farklılıklar göstermektedir. Bu sebeple mutlaka yardım dosyalarına müracaat edilmelidir.

Bu kısa (ve mutlaka yetersiz) anlatımdan sonra örneklere geçelim. Ne de olsa suya girmeden yüzme öğrenilmez. Neye benzediğini görürsek nasıl çalıştığını daha iyi akledebiliriz. Öncelikle mpg verisetinde bulunan araçların motor hacimleriyle şehirler arası yolculuktaki yakıt performanslarına ilişkin dağılım grafiğini çizelim. Önce mpg verisetinde neyin ne olduğunu hatırlamak için ?mpg ile yardım dosyasına bir göz atmakta fayda var:

library(ggplot2)
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy))

Görüldüğü gibi ggplot komutunun ardından kullanacağımız verisetini belirledik. Daha sonra kullanacağımız geom katmanını ‘+’ ile ekledik. ggplot2‘de ilave katmanlar bu şekilde’+’ işareti ile grafiğe dahil edilmektedir. Şimdi grafiğe bir değişken daha ekleyerek otomobil sınıflarını da farklı renkler olarak grafikte gösterelim:

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

Renkle beraber noktaların şeklini de değiştirebiliriz:

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = class, shape = class))
## Warning: 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.
## Warning: Removed 62 rows containing missing values (geom_point).

Yahut dördüncü bir değişkeni de şekil olarak atayabiliriz:

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

Şimdi grafiğe bir katman daha ilave ederek ilişkideki trendi görelim:

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = class)) + 
  geom_smooth(mapping = aes(x = displ, y = hwy))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Görüldüğü gibi yeni bir katman eklemek gayet kolay. Eklediğimiz bu trendi de dördüncü bir değişkene göre parçalara ayırabiliriz:

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = class)) + 
  geom_smooth(mapping = aes(x = displ, y = hwy, color = drv))
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Bu grafikte üç farklı vites türünün trend hatlarını ayrı ayrı göstermiş olduk. Trend hatlarının etrafindaki gri alanlar güven aralıklarını göstermektedir ve se = FALSE ile kaldırılabilir. Hatları çizmekte kullanılan metod method parametresi ile değiştirilebilir.

Verisetimizde çok fazla miktarda gözlem varsa hepsini aynı koordinat düzleminde görmek faydalı olmayabilir. Böyle durumlarda gözlemleri istenen bir değiişkene göre ayrı ayrı grafiklemek gerekebilir. ggplot2’de bu işlem facet yardımıyla yapılabilir:

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = class)) + 
  geom_smooth(mapping = aes(x = displ, y = hwy), se = FALSE) + 
  facet_wrap(~ drv)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Grafiği bir değişkene göre parçalara ayıracaksak facet_wrap() yeterliyken, iki değişkene göre ayıracaksak facet_grid() kullanılmalıdır:

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

Bu grafikte veriyi vites türü ve silindir sayısına göre farklı grafiklerde gösterdik.

ggplot2 çok zengin ve ilk başta karmaşık görünen bir konu. Kolları sıvayıp işin içine girdiğinizde temel seviyede grafikler çizmenin çok kolay olduğunu göreceksiniz. Detaylara hükmetmek için yardım dosyaları ve Wickham’ın yukarıdaki kitabıyla epey vakit geçirmek gerekiyor.

İleriki notlarda ggplot2’nin diğer özelliklerine değinmeye çalışacağım.