A Matplotlib
egy átfogó könyvtár statikus, animált és interaktív vizualizációk létrehozásához a Pythonban. Számtalan tutoriál hozzáférhető, amelyek az alaptól a profi szintig ismertetik a használatát. A matplotlib.pyplot
részmodul olyan függvények gyűjteménye, amelyek a matplotlib
-et úgy működtetik, mint a MATLAB. Minden pyplot
függvény változtat valamit az ábrán: például létrehoz egy ábrázolási területet, néhány vonalat rajzol, felcímkézi az ábra elemit, stb.
import matplotlib.pyplot as plt
import random
list1 = range(5)
plt.plot(list1)
[<matplotlib.lines.Line2D at 0x7f3897f93340>]
list2 = [random.random() for _ in range(5)]
print(list2)
[0.3145039238626617, 0.36277536617592354, 0.19372035563215628, 0.9574961706213058, 0.08864102083135306]
plt.plot(list1, list2)
[<matplotlib.lines.Line2D at 0x7f38ab5e3310>]
plt.plot(list1, list2, 's') # 'r^' 'gs' 'k--' 'b:' 'ro-'
[<matplotlib.lines.Line2D at 0x7f38ab79ce20>]
plt.scatter(list1, list2)
<matplotlib.collections.PathCollection at 0x7f38c01cd400>
plt.bar(list1, list2, .5)
<BarContainer object of 5 artists>
t = [i*0.01 for i in range(251)]
t2 = [(i*0.01)**2 for i in range(251)]
t3 = [(i*0.01)**3 for i in range(251)]
plt.plot(t, t2)
[<matplotlib.lines.Line2D at 0x7f38ab7cf5e0>]
plt.plot(t, t2, 'r', t, t3, 'g')
[<matplotlib.lines.Line2D at 0x7f38c00b5970>, <matplotlib.lines.Line2D at 0x7f38c00b59a0>]
plt.figure(figsize=(12, 3))
plt.subplot(131)
plt.bar(list1,list2)
plt.subplot(132)
plt.scatter(list1,list2)
plt.subplot(133)
plt.plot(list1,list2)
plt.suptitle('Functions')
plt.show()
plt.figure(figsize=(8, 12))
plt.subplot(311)
plt.bar(list1,list2)
plt.title("Bar")
plt.subplot(312)
plt.scatter(list1,list2)
plt.title("Scattered")
plt.subplot(313)
plt.plot(list1,list2)
plt.title("Plot")
plt.suptitle('Functions')
plt.tight_layout()
plt.show()
Feladat: Másoljuk az alábbi kódot egy 4test.py
nevű fájlba, majd futtassuk a python3 4test.py 4
paranccsal.
import matplotlib.pyplot as plt
import random
import sys
def my_plot():
"""
Plotting n random values.
n is read in from the terminal.
"""
n = int(sys.argv[1])
list1 = range(n)
list2 = [random.random() for _ in range(n)]
list3 = [i**2 for i in list2]
plt.subplot(311)
plt.bar(list1,list1)
plt.subplot(312)
plt.bar(list1,list2)
plt.subplot(313)
plt.bar(list1,list3)
plt.show()
def main():
my_plot()
if __name__ == "__main__":
main()
math
modul¶A faktoriális, binomiális együttható, exponenciális függvény számításához használhatjuk a math
modult:
import math
math.factorial(5)
120
math.comb(25, 10) # binomiális együttható (25 alatt a 10)
3268760
A binomiális együttható kiszámítására szolgáló math.comb()
függvény csak a Python 3.8 verziótól létezik. Ezért régebbi Pythont futtató gépen (pl. az intézeti szerveren a jupyter 3.6-ost futtat) vagy frissítsük a Pythont vagy írjunk saját comb
függvényt:
def comb(n, m):
return math.factorial(n)//math.factorial(m)//math.factorial(n-m)
comb(25, 10)
3268760
math.exp(1), math.exp(2) # the e^x function
(2.718281828459045, 7.38905609893065)
Feladat: Számítsuk ki annak valószínűségét, hogy 10-szer feldobva egy kockát, pontosan kétszer kapunk 6-ost, majd közelítsük meg ezt a valószínűséget Poisson-eloszlással számolva!
n = 10
p = 1/6
m = 2
l = n*p
binomial_dist = math.comb(n, m) * p**m * (1-p)**(n-m)
poison_dist = l**m * math.exp(-l) / math.factorial(m)
binomial_dist, poison_dist
(0.2907100492017224, 0.2623272261632803)
E feladatban három oszlopdiagramot kell kirajzolni egyetlen ábrában, minden részábra fölött egy-egy címmel. Az első ábra egy $(n,p)$ paraméterű binomiális eloszlás valószínűségeloszlását mutatja (címe „Binomiális eloszlás”), a második ábra e binomiális eloszlást szimulálva tapasztalati valószínűségeloszlást mutat (címe „Binomiális eloszlás szimulációja 1000 kísérletből”), míg a harmadik ábra a binomiális eloszlást közelítő $\lambda=n\cdot p$ paraméterű Poisson-eloszlás valószínűségeloszlásának első $n+1$ oszlopát ábrázolja (címe „Binomiális eloszlás közelítése Poisson-eloszlással”).
A program eredményeként valami hasonló ábrát fogunk kapni (a színek, skálázás,... nem lényeges része a feladatnak):
A program bemenete $n$, $p$, $k$, ahol $n$ és $p$ a binomiális eloszlás paraméterei, és $k$ a szimulációk száma. A program például parancssorból így indítható:
python3 4KovacsJutka.py 12 0.3 1000
Ne felejtsük el, hogy a sys.argv[1]
stb. paraméterek karakterláncok, ezért konvertálni kell őket számokká (int
, float
). A kész programot futtassuk le különböző számhármasokon, pl. 20 0.05 1000
, 40 0.02 1000
, 40 .5 1000
.
A binomiális eloszlás szimulációja megvalósítható úgy, hogy $n$ kísérletet végzünk egy $p$ valószínűségű esemény bekövetkezéseinek számára. A valószínűségi változó értéke $m$, ha az esemény az $n$ kísérletből $m$-szer következett be. Ezt az $n$ kísérletet $k$-szor megismételjük, így a valószínűségi változó $k$ darab értékét kapjuk. A második diagram $m$-edik oszlopa $i/k$ magas legyen, ha a valószínűségi változó $i$-szer vette föl az $m$ értéket. (A feladat e pontja egyszerű ciklusokkal és a random
modul random
függvényével megvalósítható.
A harmadik ábra egy Poisson-eloszlású $X$ valószínűségi változó első $n+1$ értékét mutatja, ahol $$ \mathbb{P}(X=m)=\frac{\lambda^m}{m!}e^{-\lambda}, \quad m=0, 1, 2,\dots,$$ ahol $\lambda=np$.
Kövessük a megadott fájlnévkonvenciót (4KovacsJutka.py
) és az első laboron tanult és a fenti példában is használt fájlszerkezetet használjuk! A beadandó feladatot teszteljük terminálból indítva!
A feladat célja binomiális eloszlású valószínűségi változó szimulálása, Poisson-eloszlásúval való közelítése, és ezeknek az elméleti eloszlással való összehasonlítása.
Programozási célok: program parancssorból való indítása, paraméterek átadása parancssorból, oszlopdiagram és részábra kirajzolása, véletlen események szimulálása.