3 ggplot2 ile Veri Görselleştirme
Bu bölümde ggplot2
paketinden yararlanarak veri görselleştirmenin nasıl yapılabileceği farklı fonksiyonlar ve örnekler üzerinden gösterilecektir.
3.1 Hazırlıklar
dplyr
paketinde birden fazla fonksiyonu aynı veri setine uygulamak için “Bağlantı Operatörü” (%>%
) kullanılırken ggplot2
paketinde ise birden fazla etkiyi aynı anda uygulamak için (+
) operatörü kullanılıyor. Bu durum başlangıç grafiğinin üzerine farklı görseller eklenmesi olarak düşünülebilir.
ggplot()
fonksiyonu ile de ilk kez karşılaşıldığından bazı özelliklerinden bahsedilmelidir. Fonksiyonun içine ilk yazılan parametre kullanılacak veri setinin ismidir. Daha sonra aes()
yardımıyla grafiğin x
ve y
koordinatları belirlenir. aes()
içerisinde ayrıca color
, fill
, alpha
, shape
, size
gibi özellikler de belirlenebilir. Bu özelliklerden işimize yarayacak olanlar kullanıldıkları yerlerde açıklanacaktır.
ggplot()
fonksiyonu tanımlandıktan sonra istenilen grafik şekline göre farklı fonksiyonlar (+
) operatörü ile üstüne eklenir. Örneğin,
- Nokta grafiği için
geom_point()
fonksiyonu, - Sütunlu grafik için
geom_bar()
fonksiyonu, - Çizgi grafiği için
geom_line()
fonksiyonu, - Isı haritası ya da grafiği için ise
geom_tile()
fonksiyonları eklenir.
3.2 Nokta Grafiği (Scatter Plot)
İlk olarak bahsedilecek grafik türü olan “Scatter Plot” temel olarak var olan verinin noktasal dağılımını göstermek için kullanılır.
“Scatter Plot” için kullanılan fonksiyon geom_point()
tir. x
ekseninde “PTF”, y
ekseninde ise “SMF” değerleri renkleri günlere göre değişecek şekilde gösterilirse (Öncelikle gün sütunu ekleniyor ve yeni bir tabloya ataması yapılıyor.),
Tabloya göz atalım,
## # A tibble: 8,760 x 6
## Tarih PTF SMF PDF NDF Gün
## <dttm> <dbl> <dbl> <dbl> <dbl> <date>
## 1 2019-01-01 00:00:00 100. 5 4.85 103. 2019-01-01
## 2 2019-01-01 01:00:00 96.7 95.0 92.2 99.6 2019-01-01
## 3 2019-01-01 02:00:00 81.6 79.6 77.2 84.0 2019-01-01
## 4 2019-01-01 03:00:00 38.6 0 0 39.7 2019-01-01
## 5 2019-01-01 04:00:00 11.5 0 0 11.9 2019-01-01
## 6 2019-01-01 05:00:00 11.1 0 0 11.5 2019-01-01
## 7 2019-01-01 06:00:00 11.1 0 0 11.5 2019-01-01
## 8 2019-01-01 07:00:00 24.4 0 0 25.1 2019-01-01
## 9 2019-01-01 08:00:00 34.5 0 0 35.5 2019-01-01
## 10 2019-01-01 09:00:00 45.2 0 0 46.6 2019-01-01
## # … with 8,750 more rows
Şimdi grafiği çizdirecek olursak,
Görülebileceği üzere öncelikle veri seti, sonrasında ise aes()
içerisinde x
ve y
koordinatları ile renk color
yardımıyla belirlendi.
Grafiği görsel olarak daha güzel hale getirmek için öncelikle arka plandaki gri kısım theme_minimal()
fonksiyonu yardımıyla kaldırılabilir.
Eksenlerinin ismini değiştirmek, x
eksenindeki yazıları döndürmek ve lejantı istenilen şekilde konumlamak için aşağıdakiler uygulanmalıdır.
ggplot(plot_df, aes(x=PTF, y=SMF, color=Gün)) +
geom_point() +
theme_minimal() +
labs(x = "PTF",
y = "SMF") +
theme(axis.text.x = element_text(angle = 45), legend.position = "top")
Burada labs()
fonksiyonu içinde x
ve y
eksenlerinin isimleri sırayla değiştirildi, theme()
fonksiyonu içerisinde axis.text.x = element_text(angle = 45)
komutu ile x
eksenindeki yazılar 45 derece döndürüldü, legend.position = "top"
komutu ile lejantın pozisyonu sayfanın üst kısmı olarak belirlendi.
3.3 Sütunlu Grafik (Bar Chart)
“Bar Chart”ta ise veriler sütunlarda gösterilir. “Scatter Plot”taki geom_point()
yerine geom_bar()
fonksiyonu, aes()
içerisinde color
yerine ise fill
kullanılır. (Burada geom_bar
içerisinde stat="identity"
yazılması zorunludur.)
Örneğin Negatif Dengesizlik Fiyatı’nın ne kadarının PTF’den ne kadarının ceza payından geldiği Haziran ayı için saatlere göre incelenmek isteniyor.
Bu durumu incelemek için gerçekleştirilen veri manipülasyonu kodunu aşağıda bulabilirsiniz.
Burada bir önceki bölümde İleri Seviye örneklerden aşina olabileceğiniz
tidyr
paketininpivot_longer()
fonksiyonu bulunuyor. Bu fonksiyon temel olarak geniş tabloları belirli sütunlarını bir ortak sütun içerisinde birleştirip bunu yaparken de satır sayısını birleştirilen sütun sayısı oranında artıran bir fonksiyondur.
Bu paketin indirme ve yüklenme aşamaları için Gerekli Paketlerin İndirilip Yüklenmesi bölümüne göz atabilirsiniz.
Örneğimizle devam edecek olursak,
plot_df <- ptfsmf %>%
mutate(Saat = hour(Tarih), Tarih = as.Date(Tarih), Fark_NDF_PTF = NDF - PTF) %>%
filter(Tarih>"2019-05-31" & Tarih<"2019-07-01") %>%
group_by(Saat) %>%
summarise(PTF = mean(PTF), Fark_NDF_PTF = mean(Fark_NDF_PTF)) %>%
ungroup() %>%
pivot_longer(cols=c(PTF, Fark_NDF_PTF), names_to="Piyasa_Degiskeni", values_to="Fiyatlar")
Tabloya göz atalım,
## # A tibble: 48 x 3
## Saat Piyasa_Degiskeni Fiyatlar
## <int> <chr> <dbl>
## 1 0 PTF 231.
## 2 0 Fark_NDF_PTF 12.4
## 3 1 PTF 253.
## 4 1 Fark_NDF_PTF 20.2
## 5 2 PTF 237.
## 6 2 Fark_NDF_PTF 17.4
## 7 3 PTF 205.
## 8 3 Fark_NDF_PTF 13.6
## 9 4 PTF 186.
## 10 4 Fark_NDF_PTF 17.4
## # … with 38 more rows
Bu şekilde bir tablo ortaya çıktı. Şimdi grafiği çizdirmek için,
Bu grafiği yüzdesel oranlarına göre tam olarak sığdırmak için ise,
ggplot(plot_df, aes(x=Saat, y=Fiyatlar, fill=Piyasa_Degiskeni)) +
geom_bar(stat="identity", position="fill")
Son olarak da daha aşina olunduğu üzere sütunları yan yana yerleştirmek için,
ggplot(plot_df, aes(x=Saat, y=Fiyatlar, fill=Piyasa_Degiskeni)) +
geom_bar(stat="identity", position="dodge")
Son iki grafikte dikkat edilmesi gereken nokta sütunları dikeyde oranları göz önüne alınarak sığdırmak için position="fill"
, yan yana yerleştirmek için ise position="dodge"
kullanılır.
En sonda yukarıda yapılan güzelleştirme operasyonları da uygulanırsa,
3.4 Çizgi Grafiği (Line Chart)
“Line Chart”larda ise tahmin edilebileceği üzere geom_line()
kullanılacaktır. Örneğin Şubat ayı saatlik ortalama PTF ve SMF değerleri incelenmek isteniyor. Öncelikle veri manipülasyonu yapılırsa,
plot_df <- ptfsmf %>%
mutate(Tarih = as_date(Tarih)) %>%
filter(Tarih>"2019-01-31" & Tarih<"2019-03-01") %>%
group_by(Tarih) %>%
summarise(PTF = mean(PTF), SMF = mean(SMF)) %>%
ungroup() %>%
pivot_longer(cols=c(PTF, SMF), names_to="Piyasa_Degiskeni", values_to="Fiyatlar")
Bu şekilde bir tablo ortaya çıkıyor.
## # A tibble: 56 x 3
## Tarih Piyasa_Degiskeni Fiyatlar
## <date> <chr> <dbl>
## 1 2019-02-01 PTF 224.
## 2 2019-02-01 SMF 262.
## 3 2019-02-02 PTF 251.
## 4 2019-02-02 SMF 179.
## 5 2019-02-03 PTF 187.
## 6 2019-02-03 SMF 127.
## 7 2019-02-04 PTF 253.
## 8 2019-02-04 SMF 234.
## 9 2019-02-05 PTF 257.
## 10 2019-02-05 SMF 220.
## # … with 46 more rows
Şimdi grafik çizdirilirse,
Yine daha güzel görünümlü bir grafik elde etmek için gerekli fonksiyonlar da yazılırsa,
ggplot(plot_df, aes(x=Tarih, y=Fiyatlar, color=Piyasa_Degiskeni)) +
geom_line() +
theme_minimal() +
labs(x = "Tarih",
y = "Fiyatlar") +
scale_x_date(date_breaks = "1 day", date_labels = "%m/%d") +
theme(axis.text.x = element_text(angle = 45), legend.position = "top")
Burada önceden gördüğümüz fonksiyonlara ek olarak, scale_x_date(date_breaks = "1 day", date_labels = "%m/%d")
komutunu görüyoruz. Bu komut sayesinde date
tipinde olan bir değişken istenilen formatta bastırılmış oluyor.
3.5 Isı Harıtası (Heat Map)
Bu grafik türünde ise iki farklı değişken baz alınarak temelde gözlenmek istenen değişkeni farklı renk tonlarında göstererek incelenmesi hedefleniyor. Bu işlem için ise geom_tile()
fonksiyonu kullanılıyor ve asıl olarak gösterilmek istenen değişken fill
fonksiyonuna veriliyor.
Örneğin Temmuz ayı için x
ekseninde saatler, y
ekseninde ise ayın günleri olacak şekilde Piyasa Takas Fiyatı (PTF) değişkeninin ısı grafiği için (Öncelikle veri manipülasyonu yapılıyor.),
plot_df <- ptfsmf %>%
mutate(Saat = hour(Tarih), Tarih = as_date(Tarih)) %>%
filter(Tarih>"2019-06-30" & Tarih<"2019-08-01") %>%
select(Saat, Tarih, PTF)
## # A tibble: 744 x 3
## Saat Tarih PTF
## <int> <date> <dbl>
## 1 0 2019-07-01 100.
## 2 1 2019-07-01 204.
## 3 2 2019-07-01 227
## 4 3 2019-07-01 150
## 5 4 2019-07-01 170.
## 6 5 2019-07-01 50.0
## 7 6 2019-07-01 100
## 8 7 2019-07-01 204.
## 9 8 2019-07-01 300.
## 10 9 2019-07-01 302.
## # … with 734 more rows
Bu şekilde bir tablo ortaya çıktı. Şimdi grafiği çizdirecek olursak,
Güzelleştirmek için yukarıdaki fonksiyonlar eklenirse,
ggplot(plot_df, aes(x=Saat, y=Tarih, fill=PTF)) +
geom_tile() +
labs(x = "Saatler",
y = "Günler") +
scale_y_date(date_breaks = "5 day", date_labels = "%m/%d") +
scale_x_discrete(limits=c(0:23)) +
theme(axis.text.x = element_text(angle = 45), legend.position = "top")
Burada ise önceden aşina olmadığımız scale_x_discrete(limits=c(0:23))
komutunu görüyoruz. Bu komut sayesinde x
ekseninde 0’dan 23’e bütün sayıları bastırabiliyoruz. (scale_y_date
komutu bir önceki bölümde anlatılan scale_y_date
komutuyla tamamen aynı işlevde olup y
ekseni ile ilgilenmektedir.)
Isı grafiğinin rengi değiştirilmek istenirse ise scale_fill_gradient
fonksiyonu içerisinde iki renk belirtilerek aralarındaki renkler kullanılabilir.
ggplot(plot_df, aes(x=Saat, y=Tarih, fill=PTF)) +
geom_tile() +
scale_fill_gradient(low="white", high="red") +
labs(x = "Saatler",
y = "Günler") +
scale_y_date(date_breaks = "5 day", date_labels = "%m/%d") +
scale_x_discrete(limits=c(0:23)) +
theme(axis.text.x = element_text(angle = 45), legend.position = "top",
legend.title = element_blank())