R’da Heatmap (Isı Haritası) Nasıl Oluşturulur?

Isı haritaları (diğer adıyla heatmap) aslında sayısal bir tabloyu ifade eder. Tek farkı,  tablo içindeki sayısal değerler yerine renk kodları yer alır. Hücredeki sayısal değerlerin karşılığında renk skalasında farklı renkler görülür. Örneğin düşük sayısal değerler mavi iken yüksek değerler kırmızı ile gösterilebilir. Bu açıdan büyük matrislerde veri dağılımı hakkında bir bakışta genel bir fikir edinilebilir.

Basit bir ısı haritası örneği. Renk kodlarını elle oluşturdum. Sayılarla pek tutmuyor olabilir. Ama siz fikri anlamışsınızdır.

Bu uygulamada temel bir ısı haritasının nasıl oluşturulduğundan değineceğiz. Bu grafikleri hem çekirdek (base) fonksiyonları ile hem de ggplot gibi ek paketlerle oluşturmak mümkün. Kümeleme (clustering) gibi ek işlemler çekirdek fonksiyonlar ile daha rahat yapılırken, ggplot() göze daha hoş grafikler oluşturmanızı mümkün kılıyor.

Üzerinde çalışmak için Türkiye meteoroloji verilerini kullanacağız. Bu verileri Meteoroloji Genel Müdürlüğü’nün web sitesinden erişebilirsiniz. Bu veriseti her bir şehrin 10 yıllık sıcaklık ortalamalarını ay bazındaki değerlerini içeriyor. Dosyayı buradan indirebilirsiniz.

heatmap()

Önce çekirdek fonksiyonlarından başlayalım. heatmap() fonksiyonu aslında ısı haritası oluşturmak için ihtiyacınız olan her şeyi barındırıyor. Bunun için bir adet sayısal matris oluşturmanız gerek. Yani data.frame kabul etmiyor. Bunun için dosyamızı içeri aktaralım ve matrise dönüştürelim.

# Çekirdek fonksiyonu olduğu için ayrıca bir paket kurmamıza gerek yok. Ama veri üzerinde rahat değişiklik yapmak için "tidyverse" paketini kuruyoruz.
library(tidyverse)

# Dosyayı içeri aktarıyoruz.
meteo      <- read.table("~/Desktop/meteo.txt", sep = "\t", header = T)

# Veriseti içindeki sayısal olmayan değerleri çıkarıp, sayısal bir matrise dönüştürüyoruz.
meteo_data <- select(meteo, -Şehir, -Bölge, -Ortalama) %>% as.matrix()

# Satır adlarını ilk dosyadan alıyoruz.
rownames(meteo_data) <- meteo[,1]

Yukarıdaki fonksiyonlarda önce dosyayı içeri aktardık. Ardından kullanmayacağımız kolonları kaldırdık ve matrise dönüştürdük. En son basamakta satır adlarını oluşturduk. Bu noktadan sonra ısı haritası oluşturmak için tek yapmak gereken heatmap() fonksiyonunu çalıştırmak.

heatmap(meteo_data)

Fonksiyonu çalıştırdığınızda aşağıdaki grafiği elde ediyoruz. Ancak görüldüğü üzere, ayların ve şehirlerin sırası tamamen kaymış. Bunun sebebi, heatmap() fonksiyonunda varsayılan ayar olarak kümeleme (clustering) yapılması. Kümeleme işleminde, benzer örüntüye sahip kolon ve satırlar yanyana konumlandırılır. Örneğin kış ayları birbirine yakındır veya aynı bölgede yer alan şehirler birbirine yakın hava durumuna sahip olacağı için heatmap içinde yakın konumlandırılır.

Buradaki ay bazındaki kümelemeyi kaldıralım. Ayrıca varsayılan renk paleti de insanı kör ettiği (!) için renklerini değiştirelim. Bu amaçla colorRampPalette() fonskiyonu ile yeni bir renk paleti oluşturacağım.

hmcols <- colorRampPalette(c("dodgerblue3","gold3","darkred"))(256)

Bu fonksiyon, girilen renk kodları arasında bir renk paleti oluşturulmasını sağlar. Yukarıdaki örnekte, dodgerblue3, gold3 ve darkred renkleri arasındaki skaladan 256 adet renkten oluşan bir palet oluşturulmasını sağlıyoruz. R içinde benzeri şekilde öntanımlı 657 renk var. Bu renklerin listesine colors() fonksiyonu ile ulaşabilirsiniz. Örnek olarak burada tüm renkleri de paylaşıyorum.

Son olarak kolonlardaki kümelemeyi de Colv = NA parametresi ile kaldıralım. Eğer satırlardaki kümelemeyi de kaldırmak isterseniz Rowv = NA parametresini de ekleyebilirsiniz. Bu şekilde, birbirine yakın hava sıcaklığı profili gösteren şehirleri de kümelenmiş olarak görebiliyoruz.

heatmap(meteo_data, Rowv = NA, col = hmcols)

ggplot()

Şimdi oluşturduğumuz ısı haritalarını görsel açıdan daha hoş kılmak için ggplot() fonksiyonlarını kullanabiliriz. Daha önce ggplot() fonksiyonların mantığından ve nasıl kullanacağımıza ggplot ile Veri Görselleştirme yazımızda bahsetmiştik. Şimdi bu fonksiyon ile ısı haritası oluşturacağız.

library(tidyverse)
meteo      <- read.table("~/Desktop/meteo.txt", sep = "\t", header = T)
meteo_data <- select(meteo, -Şehir, -Bölge, -Ortalama) %>% as.matrix()
rownames(meteo_data) <- meteo[,1]

ggplot ile tek seferde sadece 2 parametre görselleştirilebildiği için çok boyutlu matrisimizi reshape2 paketi içindeki melt() fonksiyonu ile 2 parametreli formata çeviriyoruz.

library(reshape2)
meteo_melted <- melt(meteo_data)
colnames(meteo_melted) <- c("Şehir","Ay","Sıcaklık")
ggplot(data = meteo_melted) +
 geom_tile(aes(x=Ay,y=Şehir,fill=Sıcaklık))

Grafik güzel gözüküyor ama biraz daha görsel açıdan zenginleştirelim. Örneğin labs(x="",y="") katmanı ile eksen adlarını kaldıralım. geom_tile() katmanı içine col="white" parametresi ekleyerek kutuların etrafında beyaz renkte sınır çizgileri çekelim. Ayrıca viridis renk paketini yükleyip güzel bir renk skalası oluşturalım. Ayrıca arka plandaki gri alanı da theme(panel.background = element_blank()) parametresi ile kaldıralım.

library(viridis)
ggplot(data = meteo_melted) +
geom_tile(aes(x=Ay,y=Şehir,fill=Sıcaklık), col="white", size=.3) +
 theme(panel.background = element_blank()) +
 scale_fill_viridis(option="magma") +
 labs(x="",y="")

Voila! Güzeller güzeli bir ısı haritası oluşturduk. Elbette bunu görsel açıdan daha da güzelleştirmek mümkün. Ama bu yazıda başlangıç yapmış olalım. Gelecek yazılarda buna tekrar  değiniriz.

Moleküler Biyolog ve Genetikçi.İstanbul Teknik Üniversitesi'nde doktora öğrencisi. 5 yıldır biyoinformatik ve yeni nesil dizileme üzerine çalışıyor. Genetik ve biyoinformatik üzerine Variant adlı blogda yazıyor.

3 comments On R’da Heatmap (Isı Haritası) Nasıl Oluşturulur?

Yorum bırakın:

Your email address will not be published.

Site Footer

Sliding Sidebar

Hakkımda

Hakkımda

Moleküler Biyolog ve Genetikçi. İstanbul Teknik Üniversitesi'nde doktora öğrencisi. 5 yıldır biyoinformatik ve yeni nesil dizileme üzerine çalışıyor.

Tweets

Message: Invalid or expired token., Please check your Twitter Authentication Data or internet connection.