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;
Figure: tüm çizim alanı,Axes: koordinat sistemi ve gerçek grafik alanıdır.
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ı
- Aynı eksende
sin(x),sin(2x)vesin(3x)eğrilerini açıklamalarıyla çizin. - Beş sensörün ortalama ve standart sapmalarını hata çubuklu sütun grafiğinde gösterin.
- Rastgele üretilmiş iki değişken için saçılım grafiği oluşturun.
- Bir ölçüm dizisini hem zaman grafiği hem histogram olarak iki alt grafikte gösterin.
- Hazırladığınız figürü başlık ve eksenleri kesilmeyecek biçimde PNG dosyasına kaydedin.