Table of Contents

Cvičení 12, Náhodná čísla, grafický výstup

Genealogie

class Person:
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex   
        self.children = []  
        self.parents = []   # parents of this node
        self.partner = None   # partner (=husband/wife of this node)
 
    def add_child(self, node):
        self.children.append(node)
 
    def add_parent(self, node):
        self.parents.append(node)
 
    def set_partner(self, node):
        self.partner = node
 
    def __str__(self):
        s = "Female" if self.sex == 'F' else "Male" 
        return self.name + " " + s

Vstupní soubor family.txt:

M Jana Jan F M
P Jana Martin F M
P Jana Robert F M
P Robert Gabriel M M
P Robert Oleg M M
P Robert Ondrej M M
P Martin Jiri M M
P Martin Rudolf M M
P Jan Petra M F
P Jan Uxana M F
P Uxana Klara  F F
P Uxana Jakub F M
P Uxana Adam F M
P Petra Alex F M
P A C M M
P A D M F
P D K F F
P C J M M 
P C I M F
P C H M M
P B E F F
P B F F M 
P B G F F

Schéma rodiny ve family.txt:

Generování (pseudo)náhodných čísel

Princip LCG

Generování náhodných čísel v Pythonu

import random
 
for i in range(10):
   print(random.random())

import random
 
for i in range(10):
   print(random.randint(-10,10))

Vytváření jednoduché grafiky

Hlavním objektem je plt z modulu matplotlib.pyplot, který poskytuje spoustu metod ke kreslení různých funkcí.

import numpy as np
import matplotlib.pyplot as plt
 
x = np.arange(0.,10.,0.1)
y = np.sin(x)
plt.plot(y)
plt.show()

Všimněte si, ze výsledný graf je na ose 'x' číslován od 0 do 100, neboť to je velikost pole 'y'. Další možností je na zobrazit funkci sinus společně s osou 'x' definovanou dle pole 'x':

plt.plot(x,y)

A pomocí volání funkcí 'x/ylabel' nastavíme popisky jednotlivých os

plt.xlabel('osa x')
plt.ylabel('osa y')

Samostatné úsečky: je třeba zadat pole počátečních x-ových a y-ových souřadnic.

plt.plot([x1,x2],[y1,y2],'k-');

Uložení obrázků do souboru: příkaz: savefig . Pro současné ulozeni obrázků do souboru a zobrazení je třeba volat savefig před příkazem show.

plt.savefig('jmeno.png')

Kreslení histogramu - příkaz hist

import numpy as np
import matplotlib.pyplot as plt
 
size = 10000
y = np.random.randn(size)
n, bins, patches = plt.hist(y, 50, normed=0, alpha=0.74)
plt.savefig('histogram1.png', dpi=600)
plt.show()

Poznámka: meze grafu lze určit i ručně příkazem axis

plt.axis([-5,5, 0, 0.5])

zobrazí graf na ose 'x' v rozsahu -5,5 a na ose 'y' v rozsahu 0 až 0.5.

Úkol 4: zobrazení histogramu

Kreslení fraktálů

import numpy as np
import matplotlib.pyplot as plt
 
def drawBranch(x, y, length, angle):
 
    # Konec rekurze
    if (length < 0.3):
        return
 
    a1 = 0.15
    a2 = -0.15
 
    s = 0.7
    l2 = s*length
 
    x1 = x + l2 * np.cos(angle)
    y1 = y + l2 * np.sin(angle)
 
    plt.plot([x,x1],[y,y1], 'k-')
    drawBranch(x1, y1, l2, angle+a1)
    drawBranch(x1, y1, l2, angle+a2)
 
if __name__ == '__main__':
 
    drawBranch(5,0,6,1.57)
    plt.show()