import numpy as np
import matplotlib.pyplot as plt
import math

# Základní velikost písma
plt.rcParams.update({'font.size': 22})

# Triviální příklad: jedna křivka
def example1():
    x = np.linspace(0, 2, 100)
    plt.plot(x, x ** 2)
    plt.show()

# Graf se dvěma křivkami a popsanými osami
def example2():
    x = np.linspace(0, 2, 100)
    plt.plot(x, x ** 2, label="quadratic")
    plt.plot(x, x ** 3, label="cubic")
    plt.xlabel("Čas")
    plt.ylabel("Počet svišťů")
    plt.title("Svišti na cvičišti")
    plt.legend()
    plt.show()
    # plt.savefig("figure.pdf")
    # plt.close()

# Různé styly bodů a čar
def example3():
    x = np.linspace(0, 2, 10)
    plt.plot(x, x, 'ro-', label="linear")          # Red, dots, line
    plt.plot(x, x ** 2, 'b--', label="quadratic")  # Blue, dashed line
    plt.plot(x, x ** 3, 'g^', label="cubic")       # Green, triangles
    plt.plot(x, x ** 4, 'ko-', markersize=10, linewidth=4, label="quartic")  # Heavy line, big markers
    plt.legend()
    plt.show()

# Schodiště
def example4():
    n = 32
    x = np.linspace(0, 2*math.pi, n)
    plt.plot(x, np.sin(x), 'o-', color='grey', alpha=0.5)
    plt.step(x, np.sin(x), where='pre')   # or "mid" or "post"
    plt.show()

# Sloupcový graf
def example5():
    x = np.linspace(0, math.pi, 10)
    y = np.sin(x)
    plt.bar(x, y, color='blue', edgecolor='black', width=0.2)
    plt.show()

# Histogram
def example6():
    r = np.random.random_sample(100)
    plt.hist(r, bins=10, range=(0.,1.), edgecolor='black')
    plt.show()

# Plocha mezi dvěma křivkami
def example7():
    x = np.linspace(0, 2, 100)
    plt.fill_between(x, x**2, x**3)
    plt.show()

# Polární souřadnice: srdcovka
def example8():
    phi = np.linspace(0, 2*math.pi, 100)
    r = 1 - np.cos(phi)
    plt.polar(phi, r)
    plt.show()

# Logaritmické osy
def example9():
    x = np.linspace(0, 10, 100)
    y = 2**x
    # plt.plot(x, y)
    plt.semilogy(x, y)
    # plt.loglog(x, y)
    plt.show()

# Styl "od ruky" po vzoru xkcd.com
def example10():
    x = np.linspace(0, 2, 20)
    plt.xkcd()
    plt.plot(x, x ** 2, label="quadratic")
    plt.plot(x, x ** 3, label="cubic")
    plt.xlabel("Čas")
    plt.ylabel("Počet svišťů")
    plt.title("Svišti na cvičišti")
    plt.legend()
    plt.show()

# Doplněné čáry s popiskami
def example11():
    x = np.linspace(0, 2, 100)
    plt.plot(x, x ** 2)
    plt.hlines([1., 2.], xmin=0., xmax=2.)
    plt.vlines([1.], ymin=0., ymax=3.)
    plt.text(0.1, 1.05, "y=1", fontsize=24)
    plt.annotate("y=2", (0.1, 2.05), xytext=(0.15, 2.2), arrowprops={'arrowstyle': '->'}, fontsize=24)
    plt.show()

# Více grafů v jednom obrázku
def example12():
    x = np.linspace(0, 2, 100)
    plt.subplot(221)    # zkratka za (2, 2, 1), což je (#řádků, #sloupců, kolikátý)
    plt.plot(x, x)
    plt.subplot(222)
    plt.plot(x, x**2)
    plt.subplot(223)
    plt.plot(x, x**3)
    plt.subplot(224)
    plt.plot(x, x**4)
    plt.show()

# Sdílení os
def example13():
    x = np.linspace(0, 10, 1000)
    ax = plt.subplot(311)
    plt.plot(x, np.sin(2*math.pi*x))
    plt.subplot(312, sharex=ax, sharey=ax)
    plt.plot(x, 0.5*np.sin(3*math.pi*x))
    plt.subplot(313, sharex=ax, sharey=ax)
    plt.plot(x, 0.7*np.sin(5*math.pi*x))
    plt.show()

# Objektové rozhraní
def example14():
    # Založíme obrázek
    fig, ax = plt.subplots()
    # fig je typu Figure (celý obrázek)
    # ax typu Axes (to je jeden graf)

    # Nastavíme globální vlastnosti obrázku
    fig.set_facecolor('#ccccff')

    # Nakreslíme křivku
    x = np.linspace(0, 5, 1000)
    p, = ax.plot(x, np.cos(2*math.pi*x))  # tuple -> p je typu matplotlib.lines.Line2D

    # Nastavíme vlastnosti křivky
    p.set_color('red')
    p.set_linewidth(2)

    # Upravíme textové objekty s čísly u značek na ose x
    for tick in ax.get_xticklabels():
        tick.set_rotation(55)

    plt.show()

# example1()