====== Matplotlib II – subplotok, több grafikon egy ábrán, grid, stílus, layout ======
==== Subplot alapok ====
**Egy ábrán több grafikon megjelenítése:**
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10)
plt.subplot(1, 2, 1)
plt.plot(x, x)
plt.title("y = x")
plt.subplot(1, 2, 2)
plt.plot(x, x**2)
plt.title("y = x^2")
plt.tight_layout()
plt.show()
#Magyarázat: subplot(sorok, oszlopok, pozíció)
==== Objektumorientált (OO) megközelítés ====
Komplexebb ábrák esetén strukturáltabb és tisztább.
Példa
fig, axes = plt.subplots(1, 2)
axes[0].plot(x, x)
axes[0].set_title("y = x")
axes[1].plot(x, x**2)
axes[1].set_title("y = x^2")
plt.tight_layout()
plt.show()
Feladat: Készíts 2×2 subplot elrendezést.
Ábrázold:
* x
* x²
* x³
* sqrt(x)
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 11)
fig, axes = plt.subplots(2, 2)
axes[0, 0].plot(x, x)
axes[0, 0].set_title("x")
axes[0, 1].plot(x, x**2)
axes[0, 1].set_title("x^2")
axes[1, 0].plot(x, x**3)
axes[1, 0].set_title("x^3")
axes[1, 1].plot(x, np.sqrt(x))
axes[1, 1].set_title("sqrt(x)")
plt.tight_layout()
plt.show()
==== Ábraméret és grid ====
**Ábraméret**
plt.figure(figsize=(8, 4))
plt.plot(x, x**2)
plt.show()
**Rácsvonal**
plt.plot(x, x**2)
plt.grid(True)
plt.show()
**OO módszerrel:**
fig, ax = plt.subplots()
ax.plot(x, x**2)
ax.grid(True)
plt.show()
==== Kombinált vizualizáció ====
Feladat:
* Egy cég havi bevétele 3 évre (NumPy mátrix):
* Felső grafikon: évenkénti összbevétel (bar)
* Alsó grafikon: havi átlagbevétel (line)
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
bevetel = np.random.randint(100, 501, size=(3, 12))
ossz = bevetel.sum(axis=1)
havi_atlag = bevetel.mean(axis=0)
fig, axes = plt.subplots(2, 1, figsize=(8, 6))
axes[0].bar(["1. év", "2. év", "3. év"], ossz)
axes[0].set_title("Évenkénti bevétel")
axes[1].plot(havi_atlag)
axes[1].set_title("Havi átlagbevétel")
axes[1].grid(True)
plt.tight_layout()
plt.show()
==== Stílus és olvashatóság ====
**Fontos alapelvek**
* Ne használj túl sok görbét egy grafikonon
* Ha összehasonlítás a cél → subplot
* Használj gridet trendekhez
* Az ábra válaszoljon egy konkrét kérdésre
==== Összefoglaló feladatok ====
**1. Feladat:**
* Generálj 200 véletlen pontot.
* Bal oldalon scatter plot
* Jobb oldalon ugyanaz, de négyzetre emelt y értékkel
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(200)
y = np.random.rand(200)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].scatter(x, y)
axes[0].set_title("Eredeti")
axes[1].scatter(x, y**2)
axes[1].set_title("Transzformált")
plt.tight_layout()
plt.show()
**2. Feladat – Több függvény összehasonlítása 2×2 subplot rácsban**
- Generálj 0–10 intervallumon 300 pontot.
- Ábrázold 2×2-es subplot elrendezésben:
* y = x
* y = x^2
* y = sqrt(x)
* y = sin(x)
- Minden grafikon kapjon külön címet.
- Használj egységes stílust.
- Alkalmazz tight_layout()-ot.
import numpy as np import matplotlib.pyplot as plt
plt.style.use("seaborn-v0_8")
x = np.linspace(0, 10, 300)
fig, axs = plt.subplots(2, 2, figsize=(10,8))
axs[0,0].plot(x, x)
axs[0,0].set_title("y = x")
axs[0,0].grid(True)
axs[0,1].plot(x, x**2)
axs[0,1].set_title("y = x^2")
axs[0,1].grid(True)
axs[1,0].plot(x, np.sqrt(x))
axs[1,0].set_title("y = sqrt(x)")
axs[1,0].grid(True)
axs[1,1].plot(x, np.sin(x))
axs[1,1].set_title("y = sin(x)")
axs[1,1].grid(True)
plt.tight_layout()
plt.show()
**3. Feladat – Bevételi dashboard (2×1 layout)**
- Generálj 12×3 bevételi adatot.
- Felső subplot: vonaldiagram havi bevételről üzletenként.
- Alsó subplot: oszlopdiagram az éves összbevételről.
- Használj grid-et.
- Igazítsd a layout-ot.
import numpy as np import matplotlib.pyplot as plt
np.random.seed(0)
bevetel = np.random.randint(1000, 5000, (12, 3))
honapok = np.arange(1, 13)
fig, axs = plt.subplots(2, 1, figsize=(10,8))
#Felső grafikon
axs[0].plot(honapok, bevetel[:,0], label="Üzlet 1")
axs[0].plot(honapok, bevetel[:,1], label="Üzlet 2")
axs[0].plot(honapok, bevetel[:,2], label="Üzlet 3")
axs[0].set_title("Havi bevételek")
axs[0].set_xlabel("Hónap")
axs[0].set_ylabel("Bevétel")
axs[0].legend()
axs[0].grid(True)
#Alsó grafikon
eves = np.sum(bevetel, axis=0)
axs[1].bar(["Üzlet 1", "Üzlet 2", "Üzlet 3"], eves)
axs[1].set_title("Éves összbevétel")
axs[1].set_ylabel("Bevétel")
axs[1].grid(axis="y")
plt.tight_layout()
plt.show()
**4. Feladat – Scatter és eloszlás egy ábrán (1×2 layout)**
- Generálj 500 darab (x,y) normál eloszlású pontot.
- Bal oldalon scatter plot.
- Jobb oldalon hisztogram az y értékekről.
- Használj közös stílust.
- Adj címeket és rácsvonalat.
import numpy as np import matplotlib.pyplot as plt
plt.style.use("ggplot")
np.random.seed(1)
x = np.random.randn(500)
y = np.random.randn(500)
fig, axs = plt.subplots(1, 2, figsize=(12,5))
axs[0].scatter(x, y, alpha=0.6)
axs[0].set_title("Scatter plot")
axs[0].set_xlabel("X")
axs[0].set_ylabel("Y")
axs[0].grid(True)
axs[1].hist(y, bins=30)
axs[1].set_title("Y eloszlása")
axs[1].set_xlabel("Y")
axs[1].set_ylabel("Gyakoriság")
axs[1].grid(True)
plt.tight_layout()
plt.show()
**5. Feladat – Hőtérkép és vonaldiagram kombináció**
- Generálj 20×20-as mátrixot.
- Bal subplot: imshow() hőtérkép.
- Jobb subplot: az oszlopátlagok vonaldiagramja.
- Adj colorbar-t.
- Használj layout optimalizálást.
import numpy as np import matplotlib.pyplot as plt
np.random.seed(2)
matrix = np.random.rand(20, 20)
fig, axs = plt.subplots(1, 2, figsize=(12,5))
img = axs[0].imshow(matrix)
axs[0].set_title("Hőtérkép")
axs[0].set_xlabel("Oszlop")
axs[0].set_ylabel("Sor")
plt.colorbar(img, ax=axs[0])
col_mean = np.mean(matrix, axis=0)
axs[1].plot(col_mean)
axs[1].set_title("Oszlopátlagok")
axs[1].set_xlabel("Oszlop index")
axs[1].set_ylabel("Átlag")
axs[1].grid(True)
plt.tight_layout()
plt.show()
**6. Feladat – Komplex 2×2 adatvizualizációs panel**
- Generálj 1000 normál eloszlású adatot.
- Készíts 2×2 panelt:
- Hisztogram
- Dobozdiagram (boxplot)
- Kumulatív összeg grafikon
- Szórásablakos (rolling std) grafikon
- Használj egységes stílust és layout optimalizálást.
import numpy as np import matplotlib.pyplot as plt
plt.style.use("bmh")
np.random.seed(3)
data = np.random.randn(1000)
fig, axs = plt.subplots(2, 2, figsize=(10,8))
#Hisztogram
axs[0,0].hist(data, bins=30)
axs[0,0].set_title("Hisztogram")
axs[0,0].grid(True)
#Boxplot
axs[0,1].boxplot(data)
axs[0,1].set_title("Boxplot")
axs[0,1].grid(True)
#Kumulatív összeg
cumsum = np.cumsum(data)
axs[1,0].plot(cumsum)
axs[1,0].set_title("Kumulatív összeg")
axs[1,0].grid(True)
#Rolling std (ablak=50)
window = 50
rolling_std = [np.std(data[i:i+window]) for i in range(len(data)-window)]
axs[1,1].plot(rolling_std)
axs[1,1].set_title("Rolling szórás (50)")
axs[1,1].grid(True)
plt.tight_layout()
plt.show()