matplotlib 3: Bitişik şekiller, yazı, ve diğer süslemeler

Yayınlanabilir kalitede bir grafik oluşturmak için şimdiye kadar bahsettiklerimizden daha fazla elementler eklemeniz gerekebilir. Bu kısımda şekilleri yanyana veya altalta göstermek, şekil içine daha küçük bir şekil koymak, şeklin içine yazı yerleştirmek, bir noktaya okla işaret etmek, yatay-dikey çizgiler ve şeritler eklemekten bahsedeceğiz.

Bitişik grafikler

Aynı şeklin içinde altalta, yanyana, veya düzgün bir kafes şeklinde dizilmiş alt şekiller oluşurmak için subplot() komutunu kullanabilirsiniz.

from pylab import *
x = linspace(0,10,300)

subplot(2,1,1) # iki satır, bir sütun, birinci şekil
plot(x, sin(x), "r")
title(u"Sinüs")

subplot(2,1,2) # iki satır, bir sütun, ikinci şekil
plot(x, cos(x), "g")
title(u"Kosinüs")

mp3-subplot1

Genel olarak subplot(a, b, n) komutu eldeki şekli a sayıda satıra ve b sayıda sütuna böler, her bir kısımda eksenler yaratır ve sonradan gelen çizim komutlarının n numaralı kısma uygulanmasını sağlar. Numaralandırma sol üst parça 1 olacak şekilde başlar, önce sütunlar sonra satırlar boyunca ilerleyerek ab‘ye kadar gider.

subplot(2,3,1)
text(0.4, 0.5, u"şekil 1")
subplot(2,3,2)
text(0.4, 0.5, u"şekil 2")
subplot(2,3,3)
text(0.4, 0.5, u"şekil 3")
subplot(2,3,4)
text(0.4, 0.5,u"şekil 4")
subplot(2,3,5)
text(0.4, 0.5,u"şekil 5")
subplot(2,3,6)
text(0.4, 0.5,u"şekil 6")

Bu örnekte ayrıca text() fonksiyonunu görüyoruz. Bu fonksiyon text(x, y, dize) şeklinde çağrılır ve grafik eksenlerinde x,y noktasından başlayarak dize‘yi yazar.

mp3-subplot2

Birçok durumda çerçevelerin yazıları birbirine girebilir. Meselâ aşağıdaki gibi

subplot(2,1,1)
title(u"Şekil 1")
xlabel("x ekseni")
ylabel("y ekseni")
subplot(2,1,2)
title(u"Şekil 2")
xlabel("x ekseni")
ylabel("y ekseni")

mp3-subplot3

Görüldüğü gibi eksen etiketleri ve başlıklar birbirini engelliyor. Yukarıdaki komutların ardından tight_layout() komutu verirsek şekiller daha düzgün görünecek şekilde otomatik olarak ayarlanır.

<yukarıdaki komutlar>
tight_layout()

mp3-subplot4

Bazen, aynı x eksenini paylaşan iki grafiği yapışık olarak çizdirmek isteriz. Bunu sağlamak için tight_layout fonksiyonunda h_pad parametresine 0 değeri verebiliriz.

subplot(2,1,1)
title(u"Şekil başlığı")
ylabel("y ekseni")
plot(x,sin(x),"r")
xticks([])
ylim([-1.1,1.1])
text(9.5,0.7,"(a)")

subplot(2,1,2)
xlabel("x ekseni")
ylabel("y ekseni")
ylim([-1.1,1.1])
plot(x,cos(x),"g")
text(9.5,0.7,"(b)")
tight_layout(h_pad=0)

mp3-subplot5

h_pad parametresi, bitişik alt şekiller arasındaki yüksekliği belirler. Eğer iki şekli yanyana bitiştirmek istiyorsak, aralarında genişliği belirleyen w_pad parametresini sıfırlarız.

Bu örnekler pratik durumların birçoğunu karşılar. Daha incelikli bir kontrol uygulamanıza yardımcı olacak fonksiyonlar da vardır. Bunlar genellikle daha alt seviye işlemleri birleştirip kolaylaştıran üst seviye zarf fonksiyonlardır. Matplotlib belgelerine bakarak istediğiniz duruma uygun olan bir örneği adapte edebilirsiniz.

  • subplots: x ve y eksenleri ortak olarak belirlenen alt şekiller oluşturur.
  • subplot2grid: Birden fazla sütuna veya satıra yayılan alt şekil çerçeveleri oluşturur.
  • gridspec: İstediğimiz düzende alt şekil yapıları oluşturmamızı sağlar.

Şekil içinde şekil

Bazen bir grafiğin eksenleri içinde başka bir şekli daha küçük olarak göstermeniz gerekir. Bunu, axes() fonksiyonuyla yeni bir eksen takımı oluşturarak yapabilirsiniz.

x = linspace(0,10,100)
plot(x,sin(x**2)*exp(-x))
axes([0.5,0.6,0.3,0.2])
plot(x, x*cos(x))
title(u"iç şekil")
yticks([-5,0,5])

mp3-inset

axes([x, y, a, b]) komutu, mevcut çerçeve içinde sol alt köşesi (x,y)’de olan, a genişlikte ve b yükseklikte yeni bir çerçeve oluşturur. Bu değerler ölçeklenmiş koordinatlardır, sol alt köşe (0,0), sağ üst köşe (1,1) sayılır. Matplotlib belgelerindeki benzer bir örneğe de bakabilirsiniz.

Yazı kutuları

Yukarıda text() fonksiyonuyla belli bir noktaya bir yazı koymayı gördük. Şimdi daha fazla ayrıntı görelim. Aşağıdaki örnekte çeşitli kulanım durumlarını özetliyor.

xlim([0,5])
ylim([-1,2])
# Basit kullanım
text(0.5, 1.5,u"yazı 1")

# 14 punto
text(0.75, 1, u"yazı 2", size=14)

# 16 punto, 45 derece döndür
text(1, 0.5, u"yazı 3", size=16, rotation=45)

# Büyük ve en kalın puntoyla, saydamlık vererek
# iki ayrı renk yazı üstüste.
text(0.5, -0.5, u"yazı 4", size=32,
     weight=1000, color="red", alpha=.5)
text(0.6, -0.5, u"yazı 4", size=32, 
     weight=1000, color="green", alpha=.5)

# Yazı bir kutu içinde, arka plan renkli, çerçeve yok.
text(2.5, 1.5, u"yazı 5", size=24, color="w",
     bbox=dict(facecolor='blue', edgecolor="none", alpha=0.5))

# Yazı tipini değiştir.
text(2.7, 1, u"yazı 6", family="serif", size=16)
text(2.7, 0.6, u"yazı 7", family="serif", size=16,
     style="italic")
text(2.7, 0.2, u"yazı 8", family="monospace",
     size=16)

# LaTeX ifadesi
text(2.5, -0.5, "$\int_{-\infty}^{\infty}e^{-x^2}=\sqrt{\pi}$",
     size=20)

mp3-text

size (veya fontsize) parametreleri, örneklerdeki gibi punto değeri alabilir, veya şu dizelerden birini alabilir: ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’.

rotation parametresi, derece cinsinden açı değeri, veya “vertical”, “horizontal” dizelerinden birini alabilir.

weight parametresi harf kalınlığını kontrol eder. 0 ile 1000 arasında bir sayısal değer, veya şu dizelerden birini alır: ‘ultralight’, ‘light’, ‘normal’, ‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

color ve alpha parametrelerinin kullanımı daha önce çizgiler konusunda bahsettiğimizle aynıdır.

family parametresi yazı tipini belirler. Belli bir font ismini alabilir, veya ‘serif’, ‘sans-serif’, ‘cursive’, ‘fantasy’,‘monospace’ dizelerinden birini alır. Font ismi verildiğinde .matplotlibrc konfigürasyon dosyasına başvurulur. (Bu dosyanın içeriğini değiştirerek matplotlib’in varsayılan davranışını ayarlayabilirsiniz. Yerini bulmak için matplotlib.get_configdir() komutunu verebilirsiniz.)

style parametresi ‘normal’, ‘italic’, ‘oblique’ değerlerinden birini alabilir.

Bu parametreler, grafikteki diğer yazılara (başlık, eksen başlığı, vs.) de uygulanabilir. Sözgelişi:

title(u"Başlık", family="fantasy", color="green", size=24)
xlabel("Yatay eksen x", size=16, family="serif", style="italic")
ylabel("$F_n(x)$", rotation="horizontal", size=16)
xticks(family="monospace", size=14)

mp3-text2

Yatay eksenin başlığının yan değil normal şekilde durmasını yukarıda gösterildiği gibi sağlayabilirsiniz.

İşaretleme

Belli noktalara oklarla işaret eden notlar yazmak için annotate() fonksiyonunu kullanabilirsiniz.

x = linspace(0,2*pi,100)
plot(x, sin(x))
ylim([-1.2, 1.4])
annotate("zirve", (pi/2,1.03), (2.6,1.1), arrowprops=dict(arrowstyle="->"))
annotate(u"çukur", (1.5*pi,-0.99), (5, -0.5),
         arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.3"))

mp3-annotate

Yukarıda bir düz ok bir de kıvrımlı ok gösterdik. annotate() çok daha çeşitli ok biçimleri oluşturmakta kullanılabilir. Matplotlib belgelerindeki çeşitli örneklere bakıp, ihtiyacınıza uygun olanı adapte edebilirsiniz.

Yatay çizgiler

Grafiğinize çeşitli amaçlar için (mesela alt ve üst sınırlar belirlemek için) yatay çizgiler eklemeniz gerektiğinde axhline() fonksiyonunu kullanabilirsiniz.

Tek başına axhline() komutu, şeklin tamamını kaplayan y=0 seviyesinde bir çizgi üretir. Eğrilerde yaptığımız gibi renk, çizgi kalınlığı, çizgi biçimi vs., isimli parametrelerle düzenlenebilir.

axhline(b) komutu, şekil boyunca y=b seviyesinde yatay bir çizgi çizer.

axhline(b, x1, x2) komutu y=b seviyesinde, x1 ve x2 arasında bir çizgi çizer. Burada x1, x2 çizilen verinin koordinatları değil, 0 ile 1 arasında değerler olmalıdır (0 sol kenar, 1 sağ kenar).

xlim(-2,3)
ylim(-1,2)
# y=0 seviyesinde yatay çizgi
axhline()
# y=1 seviyesinde kalın kırmızı çizgi
axhline(1, color="red", lw=5, alpha=0.7)
# y=1.5 seviyesinde x aralığının 0.25-0.75'i
# arasında yeşil çizgi
axhline(1.5, 0.25, 0.75, color="green")

mp3-axhline

Dikey çizgiler

Yatay değil dikey çizgiler eklemek istiyorsanız axvline() komutunu kullanabilirsiniz. Kullanımı axhline() gibidir, sadece x ve y değerlerini tersyüz etmeniz yeter.

xlim(-2,3)
ylim(-1,2)
# x=0 seviyesinde dikey çizgi
axvline()
# x=1 seviyesinde kalın kırmızı çizgi
axvline(1, color="red", lw=5, alpha=0.7)
# x=2 seviyesinde y aralığının 0.25-0.75'i
# arasında yeşil çizgi
axvline(2, 0.25, 0.75, color="green")

mp3-axvline

Yatay şeritler

Yatay eksen boyunca belli bir genişlikte bir şerit koymak için axhspan() komutu kullanılabilir.

axhspan(y1, y2) komutu, şekil boyunca altta y1, üstte y2 ile sınırlanmış bir şerit çizer. y1, y2 değerleri veri koordinatlarındadır.

axhspan(y1, y2, x1, x2) komutu, şeriti yatay eksende x1-x2 arasına sınırlandırır. x1, x2 değerleri 0 ile 1 arasında olmalıdır.

xlim(-2,3)
ylim(2,5)
axhspan(3, 4, alpha=0.5)
axhspan(3.5, 4.5, 0.25, 0.75, alpha=0.5, color="red")

mp3-axhspan

Dikey şeritler

Dikey eksen boyunca bir şerit koymak istiyorsanız axvspan() komutu iş görür. Kullanımı axhspan() benzeridir,  x ve y değerlerini altüst etmek yeter.

xlim(-2,3)
ylim(2,5)
axvspan(-1, 1, alpha=0.5)
axvspan(0.5, 2, 0.25, 0.75, alpha=0.5, color="red")

mp3-axvspan

Yorum bırakın