====== 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()