matplotlib 4: Logaritmik, kutupsal, histogram, ve diğer faydalı grafik türleri

Veri noktaları veya matematiksel eğriler farklı biçimlerde gösterildiklerinde daha açıklayıcı olabilirler. Bu kısımda logaritmik eksenli şekiller, kutupsal koordinatlardaki şekiller, çubuk grafikler, histogramlar, dağılım ve kabarcık grafiklerinden bahsedeceğiz.

Logaritmik eksenler

Bazı tip veriler birkaç değişik ölçeğe dağılmıştır (sözgelişi, 1-10 000 aralığı gibi). Bunları daha derli toplu olarak görmek için logaritmik ölçek kullanılabilir. Bu ölçekte 1-10 arasındaki mesafe ile 10-100 arasındaki mesafe ve 100-1000 arasındaki mesafe eşittir (10 tabanında logaritma kullanılıyorsa). Logaritmik ölçek küçük sayıları “büyütür”, büyük sayıları “küçültür”.

Logaritmik ölçek kullanmanın bir yolu, çizmek istediğiniz noktaların x ve/veya y değerlerinin logaritmalarını hesaplayıp, bu değerlerle grafik oluşturmaktır. Ama bu durumda eksenlerdeki değerler orijinal değerler olmayacaktır. Bunun yerine x,y değerlerine dokunmamak ama eksenleri logaritmik ölçeğe uygun şekilde düzenlemek daha kullanışlı olur.

Logaritmik eksenli grafikleri loglog (her iki eksen de logaritmik), semilogx (yatay eksen logaritmik) ve semilogy (dikey eksen logaritmik) fonksiyonlarıyla üretiriz.

Aşağıdaki örnek, çeşitli üstel fonksiyonların lineer eksenlerde ve logaritmik eksenlerde çizilişini gösteriyor. Daha önce gördüğümüz grafik elemanlarını da kullanıyoruz.

from pylab import *

x = arange(0.1,10,0.02)

figure(figsize=(10,4))

subplot(1,2,1)
title("Lineer eksenler")
plot(x, sqrt(x), x, x, x, x**2, x, 10/x)
legend(["$\sqrt{x}$", "$x$", "$x^{2}$", "$10/x$"], loc="upper left")
xlabel("$x$")
ylabel("$y$")
grid()

subplot(1,2,2)
title("Logaritmik eksenler")
loglog(x, sqrt(x), x, x, x, x**2, x, 10/x)
legend(["$\sqrt{x}$", "$x$", "$x^{2}$", "$10/x$"], loc="lower right")
xlabel("$x$")
ylabel("$y$")
grid()

mp4-loglog

Yukarıda da gördüğümüz gibi, y=cx^m biçimli bir eğri logaritmik eksenlerde her zaman düz bir çizgi haline gelir. Bunu iki tarafın logaritmasını alarak görebiliriz: \log y = m\log x + \log c.

Lineer ölçekte kare fonksiyonu diğerlerini neredeyse görünmez kılarken, logaritmik ölçekte bütün eğrilerin daha “demokratik” şekilde yerleştiğini görebiliriz.

Bazen sadece x değerlerinin veya sadece y değerlerinin logaritmik ölçekte çizilmesini isteyebiliriz. Bu kullanıma örnek olarak aşağıdaki şekle bakalım.

figure(figsize=(10,4))
subplot(1,2,1)
semilogx(x, sin(x))
legend(["$\sin(x)$"], loc="upper left")
xlabel("x")
ylabel("y")
title("x ekseni logaritmik")
grid(which="both")

subplot(1,2,2)
semilogy(x, exp(x), x, x, x, x**2)
legend(["$e^x$", "$x$", "$x^2$"], loc="upper left")
xlabel("x")
ylabel("y")
title("y ekseni logaritmik")
grid(which="both")

tight_layout()

mp4-semilog

Bu örnekte grid fonksiyonunun which parametresini kullandık. Her eksende büyük çentikler (major ticks) ve küçük çentikler (minor ticks) bulunur. which parametresine “major” değeri verilirse kafes çizgileri sadece büyük çentikler hizasında, “minor” verilirse küçük çentikler hizasında, “both” verilirse şekillerde görüldüğü gibi her iki tip çentiğin hizasında çizilir.

Kutupsal (polar) eğriler

Alışıldık kartezyen koordinatlarda (x,y) noktaları dik eksenlerde çizilirken, kutupsal koordinatlar merkezden uzaklık r ve yatay eksenle yapılan açı \theta cinsinden ifade edilir. Elinizdeki veriler (r,\theta) biçimindeyse bunları kutupsal eksenlerde göstermek daha doğaldır.

Kutupsal gösterim için subplot fonksiyon çağrısında polar=True vermek gereklidir. Bu komutla eksenler radar biçimine getirilir. Bundan sonra polar komutu kullanarak (r,\theta) çiftleriyle gerekli çizim yapılır. Aşağıdaki örnek kardiyoit eğrisinin kutupsal eksenlerde gösteriyor.

theta = linspace(0,2*pi,200)
r = 1+cos(theta)
polar(theta, r)

mp4-cardioid1

Aynı eğriyi kutupsal eksenlerde ve kartezyen eksenlerde ayrı ayrı çizelim. Kutupsal eksen için alt şekil tanımlarken subplot çağrısında polar=True yazmak gereklidir.

theta = linspace(0,2*pi,200)
r = 1+cos(theta)
subplot(121, polar=True)
polar(theta, r)

subplot(122)
plot(r*cos(theta), r*sin(theta))
axis("scaled") 
grid()
tight_layout()

mp4-cardioid

Çubuk grafikler

Çubuk grafik oluşturmak için bar fonksiyonu kullanılır. Aşağıdaki örneklerde e^{-\left(\frac{x-10}{4}\right)^2} fonksiyonunu hem çubuk hem çizgi olarak gösteriyoruz.

x1 = arange(0,20)
bar(x1, exp(-((x1-10)/4.0)**2)) # çubuk grafik

x2 = linspace(0,20,200)
plot(x2, exp(-((x2-10)/4.0)**2), "r", lw=2) # çizgi grafik

mp4-bar1

Görüldüğü gibi çubuklar sol üst köşeleri veri noktasına denk gelecek şekilde ayarlanmış. Bunu değiştirmek için bar fonksiyon çağrısına align=”center” parametresi verebiliriz. Ayrıca biraz biçimlendirme yapalım: Çubukların genişliğini 1 yaparak aralarında boşluk kalmamasını sağlayalım, renkleri %50 gri olsun, kenar çizgileri beyaz olsun, ve 0.6 alfa değeri verelim.

bar(x1, exp(-((x1-10)/4.0)**2), facecolor="0.5", edgecolor="white", width=1, alpha=0.6, align="center")
plot(x2, exp(-((x2-10)/4.0)**2), "r", lw=2)

mp4-bar2

Dikey ekseni logaritmik hale getirmek için bar fonksiyonuna log=True parametresi verebiliriz.

bar(x1, exp(-((x1-10)/4.0)**2),log=True, facecolor="0.5", edgecolor="white", width=1, alpha=0.6, align="center")
plot(x2, exp(-((x2-10)/4.0)**2), "r", lw=2)

mp4-bar3

Değişik bir örnek: Verilerinizin hatalarına dair tahminleri çubuk grafiğin üzerine hata aralıkları olarak çizdirebilirsiniz. bar‘ın yerr parametresi, verilerle aynı uzunlukta bir vektör alır, veya tek bir sayı alır (o zaman her nokta için hata payı bu sabit değer olur). ecolor parametresi hata çubuklarının rengini belirler.

xdata = [1, 1.3, 1.7, 2, 2.2, 2.5, 3]
ydata = [0.4, 0.5, 0.7, 0.8, 0.8, 0.65, 0.45]
yhata = [0.01, 0.02, 0.1, 0.1, 0.08, 0.07, 0.09]
bar(xdata, ydata, yerr=yhata, ecolor="red", facecolor="0.7", width=0.1, align="center")

mp4-errorbars

Histogramlar

Histogramlar dağılımları göstermekte kullanılırlar. Önceden sayı aralıkları belirlenir ve her bir aralığa eldeki verilerden kaç tanesinin düştüğü sayılır. hist fonksiyonu, bir veri dizisi alarak bu sayma işlemini otomatik olarak yapar ve grafiğini çizer.

Veri olarak, normal (çan eğrisi) dağılımıyla 10,000 rastgele sayı üretelim. Bu sentetik verinin histogramının çan eğrisi biçimine uyması beklenir.

x = randn(10000)
hist(x, 100)

mp4-hist1

Buradaki hist(x, 100) komutu, x vektöründeki en küçük ve en büyük değer arasını 100 aralığa böler, ve her aralığa kaç veri noktası düştüğünü sayar. Çan eğrisinden  beklediğimiz gibi tepesi 0’da olan ve ±1 noktalarında zirvenin %67’sine inen bir biçim görüyoruz.

Mutlak sayılar yerine olasılık dağılımı kullanmak yaygındır. hist fonksiyonunun normed parametresi True değerini alırsa, veri değerleri normalize edilir, yani çubukların toplam alanı 1 olacak şekilde sabit bir sayıyla çarpılır.

hist(x, 100, normed=True)

mp4-hist2

Dağılım histogramında her çubuğun uzunluğu, verinin o aralıkta bulunması ihtimalini verir. Bunun yanı sıra birikimli (cumulative) dağılım da sık kullanılır. Birikimli dağılımda çubuğun uzunluğu, o aralıkta veya daha küçük olan veri noktalarının sayısını verir. Dolayısıyla en küçük değerlerde sıfıra yakındır, en büyük değerlerde ise toplam veri noktası sayısına ulaşır.

Birikimli dağılım için hist çağrısında cumulative parametresine True değeri vermek gerekir. Eğer ayrıca normed=True verilmişse, değerler son aralıktaki yükseklik 1 olacak şekilde normalize edilir.

hist(x, 100, cumulative=True, normed=True)

mp4-hist3

Daha hafif bir grafik olması için çubuklar değil basamaklar kullanabilirsiniz.

hist(x, 100, cumulative=True, normed=True, histtype="step")

mp4-hist4

bins parametresine bir dizi vererek histogramdaki aralıkları istediğiniz şekilde düzenleyebilirsiniz. Aşağıdaki komut (-3, -2.5), (-2.5, 2), …, (3, 3.5) aralıklarını kullanarak histogram oluşturur.

hist(x, bins=arange(-3,4,0.5))

mp4-hist5

Bu aralıkların aynı genişlikte olması da şart değildir.

hist(x, bins=[-3,-2.5, -1.9, -1.5, -0.7, 0, 1, 1.6, 2, 2.7, 3.5])

mp4-hist6

Biraz süsleme yapalım: Çubuklar yeşil, kenarları kırmızı olsun ve şeffaflık için alfa değerini 0.6 yapalım. Ayrıca, çubukların aralığın tamamını değil %75’ini örtmesi için rwidth parametresine 0.75 değeri verelim.

hist(x, bins=arange(-3,4,0.5), color="green",
     alpha=0.6, edgecolor="red", rwidth=0.75)

mp4-hist8

Eğer histogram verilerini başka işlemlerde kullanmak için saklamak istiyorsanız, NumPy’ın histogram fonksiyonunu kullanabilirsiniz.

>>> histogram(x,bins=arange(-3,4,0.5))
(array([  51,  148,  442,  918, 1535, 1956, 1812, 1535,  933,  422,  172, 55,   10]),
 array([-3. , -2.5, -2. , -1.5, -1. , -0.5,  0. ,  0.5,  1. ,  1.5,  2. , 2.5,  3. ,  3.5]))

Dağılım (scatter) ve kabarcık grafikleri

scatter komutuyla hazırlanan grafiklerde, normal plot ile elde edilenlerden farklı olarak her noktanın rengi ve büyüklüğü ayrı ayrı belirlenebilir. Böylece dört ayrı boyutta veri görsellemesi sağlanabilir.

Aşağıdaki örnekte x ve y değerlerini 0 ile 1 arasında rastgele belirliyoruz. Dairelerin renkleri 0 ile 1 arasında, büyüklüklerinin karesi ise 100 ile 2000 arasında yine rastgele belirlendi. colorbar komutuyla renklere karşılık gelen değerlerin ölçeğini de grafiğe ekliyoruz.

x = rand(30)  # (0,1) arası rastgele değerler
y = rand(30)  # (0,1) arası rastgele değerler
alan = rand(30)*1900 + 100 # (100,1000) arası rastgele değerler
renk = rand(30) # (0,1) arası rastgele değerler
scatter(x, y, s=alan, c=renk, alpha=0.7)
colorbar()

mp4-scatter1

Renk için kullanılan değerlerin 0 ile 1 arasında olması zorunlu değil. Başka aralıklarda bulunan veriler renk skalasını tam kullanacak şekilde ölçeklenir.

Kabarcık şekilleri kullanan daha anlamlı örnekler için gapminder sitesinde bulunabilir. Sözgelişi aşağıdaki şekil ülkelerin kişi başına milli gelirleri ile yaşam beklentilerini karşılaştırıyor. Kabarcıkların büyüklüğü nüfusu, rengi ise coğrafi bölgeyi belirliyor.

gapminder

Yorum bırakın