Dersler

View on GitHub

EEM-241 İleri Düzey Programlama

2024-2025 Güz Dönemi

Ders 11 - Matplotlib ile Veri Görselleştirme

1. Kurulum ve temel kavramlar

Gerekirse terminalde:

pip install matplotlib
import numpy as np
import matplotlib.pyplot as plt

Matplotlib’de;

Sınıfta örnekler fig, ax = plt.subplots() yaklaşımıyla ilerleyecektir. Bu yöntem, çoklu grafiklerde hangi ayarın hangi eksene ait olduğunu açık tutar.

2. İlk çizgi grafiği

x = np.arange(1, 11)
y = x ** 2

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title("Sayıların Kareleri")
ax.set_xlabel("x")
ax.set_ylabel("x²")
ax.grid(True)
plt.show()

x ve y aynı sayıda eleman içermelidir.

3. Birden fazla veri serisi

x = np.linspace(0, 2 * np.pi, 200)
sinus = np.sin(x)
kosinus = np.cos(x)

fig, ax = plt.subplots()
ax.plot(x, sinus, label="sin(x)", color="tab:blue")
ax.plot(x, kosinus, label="cos(x)", color="tab:orange", linestyle="--")
ax.set_title("Sinüs ve Kosinüs")
ax.set_xlabel("Açı (radyan)")
ax.set_ylabel("Genlik")
ax.legend()
ax.grid(True, linestyle=":")
plt.show()

Renk ve çizgi biçimi anlam taşımalı; yalnızca süsleme amacıyla aşırı çeşit kullanılmamalıdır.

4. İşaretçi ve çizgi biçimleri

x = np.arange(1, 6)
y = x ** 2

fig, ax = plt.subplots()
ax.plot(x, y, color="red", linestyle="--", marker="o", linewidth=2)
plt.show()

Sık kullanılan işaretçiler: o, s, ^, *. Sık kullanılan çizgiler: -, --, :, -..

5. Grafik türünü veriye göre seçme

Saçılım grafiği

İki sayısal değişken arasındaki ilişki için:

rng = np.random.default_rng(42)
gerilim = rng.uniform(0, 12, 60)
akim = 0.2 * gerilim + rng.normal(0, 0.15, 60)

fig, ax = plt.subplots()
ax.scatter(gerilim, akim, alpha=0.7)
ax.set_xlabel("Gerilim (V)")
ax.set_ylabel("Akım (A)")
ax.set_title("Gerilim-Akım Ölçümleri")
plt.show()

Sütun grafiği

Kategorileri karşılaştırmak için:

sensorler = ["S1", "S2", "S3", "S4"]
ortalamalar = [12.4, 15.1, 11.8, 14.3]

fig, ax = plt.subplots()
ax.bar(sensorler, ortalamalar, color="tab:green")
ax.set_ylabel("Ortalama ölçüm")
ax.set_title("Sensör Karşılaştırması")
plt.show()

Histogram

Bir sayısal değişkenin dağılımı için:

rng = np.random.default_rng(3)
olcumler = rng.normal(50, 5, 500)

fig, ax = plt.subplots()
ax.hist(olcumler, bins=20, edgecolor="black")
ax.set_xlabel("Ölçüm")
ax.set_ylabel("Frekans")
ax.set_title("Ölçümlerin Dağılımı")
plt.show()

6. Eksen sınırları, açıklama ve referans çizgileri

x = np.linspace(0, 10, 100)
y = x ** 2

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlim(0, 10)
ax.set_ylim(0, 110)
ax.axhline(50, color="red", linestyle="--", label="Sınır")
ax.annotate("Sınır geçildi", xy=(np.sqrt(50), 50),
            xytext=(4, 80), arrowprops={"arrowstyle": "->"})
ax.legend()
plt.show()

Eksenleri veri hakkında yanıltıcı izlenim oluşturacak biçimde kesmemeye dikkat edilmelidir.

7. Alt grafikler

t = np.linspace(0, 2 * np.pi, 200)

fig, axes = plt.subplots(2, 2, figsize=(10, 6))

axes[0, 0].plot(t, np.sin(t))
axes[0, 0].set_title("sin(t)")

axes[0, 1].plot(t, np.cos(t), color="tab:orange")
axes[0, 1].set_title("cos(t)")

axes[1, 0].plot(t, np.sin(2 * t), color="tab:green")
axes[1, 0].set_title("sin(2t)")

axes[1, 1].plot(t, np.exp(-t), color="tab:red")
axes[1, 1].set_title("exp(-t)")

fig.suptitle("Temel Sinyaller")
fig.tight_layout()
plt.show()

plt.subplot(321) gibi üç basamaklı kısa gösterim mümkündür; fakat plt.subplots yaklaşımı daha okunaklı ve ölçeklenebilirdir.

8. Gruplandırılmış sütun grafiği

etiketler = ["D1", "D2", "D3", "D4"]
birinci = np.array([12, 18, 15, 20])
ikinci = np.array([14, 16, 19, 17])
x = np.arange(len(etiketler))
genislik = 0.35

fig, ax = plt.subplots()
ax.bar(x - genislik / 2, birinci, genislik, label="Deney 1")
ax.bar(x + genislik / 2, ikinci, genislik, label="Deney 2")
ax.set_xticks(x, etiketler)
ax.set_ylabel("Ölçüm")
ax.legend()
plt.show()

9. Grafiği kaydetme

savefig, show çağrısından önce kullanılmalıdır.

x = np.linspace(0, 5, 100)
y = np.exp(-x)

fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(x, y)
ax.set_title("Sönümlü İşaret")
ax.set_xlabel("Zaman (s)")
ax.set_ylabel("Genlik")
fig.tight_layout()
fig.savefig("sonumlu_isaret.png", dpi=150, bbox_inches="tight")
plt.show()

10. Bütünleştirici uygulama: Ölçüm raporu

rng = np.random.default_rng(8)
zaman = np.linspace(0, 10, 200)
olcum = np.sin(2 * np.pi * 0.5 * zaman) + rng.normal(0, 0.15, zaman.size)

fig, axes = plt.subplots(1, 2, figsize=(11, 4))

axes[0].plot(zaman, olcum, linewidth=1)
axes[0].set_title("Zamana Bağlı Ölçüm")
axes[0].set_xlabel("Zaman (s)")
axes[0].set_ylabel("Genlik")
axes[0].grid(True, linestyle=":")

axes[1].hist(olcum, bins=20, edgecolor="black")
axes[1].set_title("Ölçüm Dağılımı")
axes[1].set_xlabel("Genlik")

fig.tight_layout()
plt.show()

Ders sonu alıştırmaları

  1. Aynı eksende sin(x), sin(2x) ve sin(3x) eğrilerini açıklamalarıyla çizin.
  2. Beş sensörün ortalama ve standart sapmalarını hata çubuklu sütun grafiğinde gösterin.
  3. Rastgele üretilmiş iki değişken için saçılım grafiği oluşturun.
  4. Bir ölçüm dizisini hem zaman grafiği hem histogram olarak iki alt grafikte gösterin.
  5. Hazırladığınız figürü başlık ve eksenleri kesilmeyecek biçimde PNG dosyasına kaydedin.