# 1. Matplotlib

agg
cairo
eps
pdf
png
ps
svg
raster graphics
vector graphics

## 1.2. What is matplotlib

Pyplot's state-machine environment behaves similarly to MATLAB and should be most familiar to users with MATLAB experience.

## 1.3. Installing and using matplotlib



### 1.10.2. Annotating text

import numpy as np
import matplotlib.pyplot as plt

ax = plt.subplot(111)

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)

plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='black', shrink=0.05),
)

plt.ylim(-2,2)
plt.show()


Figure 84. Annotating text

## 1.11. Logarithmic and other nonlinear axes

plt.xscale('log')

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import NullFormatter  # useful for logit scale

# Fixing random state for reproducibility
np.random.seed(19680801)

# make up some data in the interval ]0, 1[
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))

# plot with various axes scales
plt.figure(1)

# linear
plt.subplot(221)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)

# log
plt.subplot(222)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)

# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.01)
plt.title('symlog')
plt.grid(True)

# logit
plt.subplot(224)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)
# Format the minor tick labels of the y-axis into empty strings with
# NullFormatter, to avoid cumbering the axis with too many labels.
plt.gca().yaxis.set_minor_formatter(NullFormatter())
# Adjust the subplot layout, because the logit one may take more space
# than usual, due to y-tick labels like "1 - 10^{-3}"
wspace=0.35)

plt.show()


Figure 85. Logarithmic and other nonlinear axes

## 1.12. plt.plot() vs ax.plot()

fig = plt.figure()
plt.plot(data)
fig.show()

1. Takes the current figure and axes (if none exists it will create a new one) and plot into them:

line = plt.plot(data)

2. In your case, the behavior is same as before with explicitly stating the axes for plot:

ax = plt.axes()
line = ax.plot(data)

3. This approach of using ax.plot(...) is a must, if you want to plot into multiple axes (possibly in one figure). For example when using a subplots. Explicitly creates new figure - you will not add anything to previous one. Explicitly creates a new axes with given rectangle shape and the rest is the same as with 2:

fig = plt.figure()
line = ax.plot(data)


possible problem using figure.add_axes is that it may add a new axes object to the figure, which will overlay the first one (or others). This happens if the requested size does not match the existing ones.

## 1.13. Assignment

### 1.13.1. Trigonometry

• Complexity level: medium

• Lines of code to write: 15 lines

• Estimated time of completion: 20 min

1. Dla x z przedziału od 0.0 do 1.0 z próbkowaniem co 0.01 przedstaw przebiegi funkcji sin, cos dla parametrów 2 * np.pi * x

2. Stwórz dwa osobne obrazki (figure):

• Każdy z przebiegów na osobnym subplot

• Na jednym plot dwa przebiegi funkcji

3. Wykresy (subplot) mają być jeden nad drugim

4. Wykresy podpisz nazwą funkcji trygonometrycznej

5. Tekst etykiety osi y ustaw na "Wartość funkcji"

6. Pokoloruj nazwy thicków x dla wykresu sin na czerwono

7. Pokoloruj nazwę (label) dla cos na kolor zielony

8. Na obu wykresach pokaż grid

9. Narysuj drugi obrazek z nałożonymi na jeden plot wykresami obu funkcji

Hint
• np.sin()

• np.cos()

### 1.13.2. Iris scatter

• Complexity level: medium

• Lines of code to write: 20 lines

• Estimated time of completion: 20 min

1. Z podanego powyżej adresu URL pobierz dane

2. Dla każdego gatunku

3. Dane stosunku sepal_length do sepal_width zwizualizuj w formie scatter za pomocą matplotlib

4. Każdy gatunek powinien mieć inny kolor

Hint
• pd.groupby()

### 1.13.3. Random points

1. Wygeneruj 100 losowych punktów:

• rozkład gaussa o średniej 0

• o odchyleniu standardowym równym 0.2

2. Punkty muszą być wylosowane wokół dwóch wybranych punktów (A = (0, 1), B = (2, 4)).

3. Funkcja musi przechodzić doctest

def random_point(center, std: int = 0.2):
"""
>>> random.seed(1); random_point((0,0), std=0.2)
(0.2576369506310926, 0.2898891217399542)

>>> random.seed(1); random_point((0,0))
(0.2576369506310926, 0.2898891217399542)

>>> random.seed(1); random_point((2,5), std=10)
(14.881847531554628, 19.494456086997708)

>>> random.seed(1); random_point((2,5), std=(0.1, 12))
(2.1288184753155464, 22.393347304397253)
"""
pass

1. Wyrysuj te punkty na wykresie (możesz użyć funkcji plt.axis('equal') żeby osie wykresu były w tej samej skali).

2. Punkt A i punkty wygenerowane na jego podstawie wyrysuj kolorem czerwonym

3. punkt B i punkty wygenerowane na jego podstawie wyrysuj kolorem niebieskim

4. Możesz do tego celu napisać funkcję plot_point(point, color), która przyjmuje punkt (dwuelementowy tuple, lub listę, z czego pierwszy element to współrzędna x, a druga to y), i kolor i doda ten punkt do aktualnie aktywnego rysunku.

5. Korzystając z funkcji napisanej w ćwiczeniu powyżej oblicz odległość od każdego z punktów do punktów A i B

6. Na podstawie tej odległości zaklasyfikuj te punkty

• jeżeli punkt jest bliżej punktu A to należy do zbioru A

• jeżeli jest bliżej do zbioru B to należy do zbioru B

7. Narysuj nowy wykres, na którym:

• punkty ze zbioru A będą narysowane kolorem czerwonym,

• punkty ze zbioru B będą narysowane kolorem niebieskim.

8. Czy dwa wykresy są takie same?

9. Co się stanie jeżeli będziemy zwiększali odchylenie standardowe przy generacji punktów?

10. Albo przybliżymy do siebie punkty A i B?

Hints
• argument color='red' w funkcji plt.plot`