Matplotlib’de Çoklu Çizim Nasıl Yapılır? - Subplot, GridSpec

Murat Açıkgöz
Kodluyoruz
Published in
4 min readSep 11, 2020
Adobe XD Ideas

Grafikleri alt alta sıralamak yerine çoklu incelemek istediğimizde, grid sistemi oldukça işlevsel çözümler sunuyor. Grid sistemler, gerek çıktıların yorumlanması olsun, gerekse analiz sonuçlarını son kullanıcıya ulaştırabilmek için iyi bir sunum altyapısı oluşturuyor. Çıktıları hızlı gözleyebilmek veya karşılaştırabilmek için sade ve çeşitlilik sağlayan bu tasarım düzeni, son kullanıcı için üretkenliği arttırmak adına ideal çözümler sunmaktadır.

Peki grid sistem nedir? Temelde satır ve sütun tabanlı kılavuz çizgilerinin oluşturduğu arayüz altyapısıdır. Bu çizgiler referans alınarak içerik yerleştirilmektedir. Tabi biz grafiksel çıktıların yerleşimi için kullanacağız.

Bahsi geçen layout düzeni aslında UX/UI kavramsal odağında incelendiğinde arayüz çalışmaları için vazgeçilmez araçlar arasındadır. Gazetelerden tutun da web sayfalarına kadar geniş bir kullanım alanına sahiptir.

Matplotlib Subplot

Eee Matplotlib bu işin neresinde? Grafiksel çalışmalar için geniş seçenekler sunan Matplotlib kütüphanesi, kendi içinde gelişmiş bir grid altyapısı sağlıyor. Sunulan parametrik seçenekleri -tüm detaylarıyla o kadar güzel düşünülmüş ki- sayesinde, rahatlıkla her türlü ihtiyaca uygun, kullanıcı dostu grafiksel çözümler üretebilmektedir. Kütüphanede standart arayüzler için subplot, özelleştirilebilir yerler için gridspec ve subplot2grid parametrik fonksiyonları bulunmaktadır. Bu içerikte, ilgili parametrelerin temel düzeyde işlevsel kullanımını göstermeyi hedeflemekteyim, alternatif kullanım yolları ve yerleri bulunabilmektedir.

Standart boyutlu grafik çıktıları için subplot görselleştirmelerini rahatlıkla yapabilmeme rağmen, standart dışı farklı boyutlu grid çıktıları için sık sık doküman okumak zorunda kalıyordum. Bu içerikte ekstra zamandan kurtulmak, bilgiye hızlıca ulaşabilmek için derlediğim başlıklara yer vereceğim.

Haydi başlayalım… İhtiyacımız olan kütüphaneler, örnek oluşturabilmemiz için Numpy ve görselleştirme için Matplotlib kullanılacaktır.

import numpy as np
import matplotlib.pyplot as plt

.subplots()

Hızlı alt grafikler oluşturmak için kullanılabilir. İlk iki parametreye oluşturulacak satır ve sütun sayısı girilir, figsize ile çerçevenin boyutlarını ayarlarız. Örnekte 1 satırlı, 2 sütunlu bir axis oluşturuldu. Ayrıca aynı subplot içinde farklı grafikler çizdirilebilir.

x = np.linspace(0, np.pi, 100)
y = np.sin(x**2) + np.sin(x)
fig, ax = plt.subplots(1, 2, figsize=(9, 4))
ax[0].plot(x, y)
ax[0].plot(x, -y)
ax[1].plot(x, -y);

.subplot()

Tekil olarak alt grafikler oluşturmamızı sağlar. İlk iki parametre satır ve sütunu, 3. parametre ile sırası girilir. Örnekte 2x3 axisli arayüz kullanıldı, çizdirilecek her grafik ayrı ayrı subplot altına uygulandı.

plt.subplot(2,1,1)
plt.plot(x, y, label='2,1,1')
plt.xticks([])
plt.legend()
plt.subplot(2,3,4)
plt.plot(-x, y, label='2,3,4')
plt.legend()
plt.subplot(2,3,5)
plt.plot(x, y, label='2,3,5')
plt.xticks([])
plt.legend()
plt.subplot(2,3,6)
plt.plot(-x, -y, label='2,3,6')
plt.legend()
plt.tight_layout();

Subplot fonksiyonunu döngü içinde kullanarak daha hızlı sonuçlar alabilirsiniz. Bu yöntem için python’ın enumerate veya zip fonksiyonları daha basit kodlar yazmanızı sağlayabilir.

plt.figure(figsize=(12, 4))
columns = [np.sin(x), np.sin(x)**5, np.cos(x), np.cos(x), np.sin(x+0.6)**2, np.sin(x)]
for i, col in enumerate(columns, 1):
plt.subplot(2, 3, i)
plt.plot(col,y)
plt.tight_layout()

Axisleri birleştirmek* için alternatifler yollar bulunmaktadır. Aşağıda 4x2 axisli bir örnek yer almaktadır, ama sıralamalar üzerinde düzenlemeyle bambaşka bir grid altyapısı oluşturulmuştur.

sub_x = [(4,2,(1,2)), (4,2,3), (4,2,(5,7)), (4,2,(4,8))]
for row, col, numb in sub_x:
plt.subplot(row, col, numb)
plt.xticks([])
plt.yticks([])
plt.tight_layout()

.gridspec()

Yukarıda oluşturduğumuz subplot’u gridspec fonksiyonu kullanarak oluşturalım. Daha karmaşık subplot’lar oluşturmak için kullanılabilir.

fig = plt.figure(figsize=(7,5))
gs = fig.add_gridspec(4, 2)
ax1 = fig.add_subplot(gs[0, 0:])
ax1.plot(x, y)
ax2 = fig.add_subplot(gs[1, 0])
ax2.plot(x, -y)
ax3 = fig.add_subplot(gs[1:, 1])
ax3.plot(-x, y)
ax4 = fig.add_subplot(gs[2:, 0])
ax4.plot(-x, -y)
plt.tight_layout();

Grafikler arasında boşlukları optimize edebilmek için plt.tight_layout() fonksiyonu kullanıldı ve sonlarda yer alan ; işaret iseplt.show() yazımından kurtardı.

Subplot, son kullanıcı için okunabilirliği arttırmaya yönelik iyi bir yöntemdir. Örneklerde gösterilenler, hızlı aksiyon alabilmeniz adına pratik temel kullanımlardır. Basit olarak subplot üzerine söyleyeceklerim bunlar, ama Matplotlib kütüphanesinde subplot’lar için colorbar ekleme, grafikler arası boşlukların ayarlanması, paylaşımlı xtick çubukların kullanımı gibi daha bir çok parametrik seçenek bulunuyor. Daha fazlasını merak edenler için buraya link bırakıyorum, örneklere göz atabilirsiniz. 🦕

Okuduğunuz için teşekkür ederim, sağlıklar dilerim. 👋

--

--