Vyprávíme příběh s daty

Vizualizace dat

Matplotlib, Seaborn 🐟

Nasťa a Filip Sedlákovi

Proč budeme používat dvě knihovny pro vizualizaci dat?

Matplotlib je základní knihovna v Pythonu pro vrsvenou vizualizaci dat

Seaborn doplňuje Matplotlib a děla grafy hezčí ❤️

Náš postup: udělat základ v matplotlibu a případně ho doplnit seabornem

Vizualizace dat - postup

  1. Vytvořit obrázek

  2. Přidat data - přímky, body, sloupce, atd.

  3. Přidat popisky os, celého obrázku, text do grafu

Jak naimportuji matplotlib a seaborn?

In [1]:
import matplotlib.pyplot as plt
import seaborn as sns

# Následujicí řádek je potřeba pro zobrazení matplotlib grafů v Jupyter notebooku
%matplotlib inline 

Odbočka: jak naimportuji vzorová data z knihovny seaborn?

sns.load_dataset('jméno souboru bez koncovky')

Seznam dostupných dat zde.

Pozor: pro načtení svých dat použijte pd.read_csv.

In [2]:
cars = sns.load_dataset('car_crashes')
cars.head()
Out[2]:
total speeding alcohol not_distracted no_previous ins_premium ins_losses abbrev
0 18.8 7.332 5.640 18.048 15.040 784.55 145.08 AL
1 18.1 7.421 4.525 16.290 17.014 1053.48 133.93 AK
2 18.6 6.510 5.208 15.624 17.856 899.47 110.35 AZ
3 22.4 4.032 5.824 21.056 21.280 827.34 142.39 AR
4 12.0 4.200 3.360 10.920 10.680 878.41 165.63 CA

První příklad

Použijeme data primates.csv a uděláme bodový graf, kde na x ose bude váha mozku a na y ose vaha těla.

Pro vykreslení bodového grafu použíjeme matplotlib.pyplot.scatter

In [3]:
import pandas as pd

data = pd.read_csv('primates.csv')
data.rename(index=str, columns={'Unnamed: 0': 'Species'}, inplace=True)
data
Out[3]:
Species Bodywt Brainwt
0 Potar monkey 10.0 115
1 Gorilla 207.0 406
2 Human 62.0 1320
3 Rhesus monkey 6.8 179
4 Chimp 52.2 440

Vytvořit obrázek

plt.subplots vytvoří obrázek s grafy (základní nastavení 1 graf)

Můžeme změnit velikost pomocí figsize

Figure je celý obrázek

Axes je graf (může být i více), neplést s axis (osa)

In [4]:
fig, ax = plt.subplots()
In [5]:
fig, ax = plt.subplots(figsize=(10,6))
In [6]:
fig, ax = plt.subplots(2)

Přidat data

ax.scatter vytvoří bodový graf

In [7]:
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data)
Out[7]:
<matplotlib.collections.PathCollection at 0x11ac03748>
In [8]:
# Do x a y můžeme dávat i seznamy hodnot
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x=['a', 'b', 'c'], y=[1,2,3])
Out[8]:
<matplotlib.collections.PathCollection at 0x11adaa5f8>
In [9]:
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x=data.Brainwt, y=data.Bodywt)
Out[9]:
<matplotlib.collections.PathCollection at 0x11adfec50>
In [10]:
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x=data.Brainwt, y=data.Bodywt)
# show() nás zbaví <matplotlib.collections.PathCollection at 0x...>
# Navíc tento kód zobrazí graf i kdybychom jej spouštěli mimo Jupyter
plt.show()
In [11]:
# Můžeme nastavit barvu a průhlednost
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data, c='#d24049', alpha=0.5)
plt.show()

Parametry scatter (platí nejen pro tuto metodu)

  • c - barva, např. 'g', '#d24049', 'red' i seznam barev

  • alpha - průhlednost, 0 (uplně průhledné) - 1 (neprůhledné)

  • marker - tvar bodu, více tady

  • s - velikost i seznam velikostí

In [12]:
# Pomoci marker a s nastavime symbol a jeho velikost
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data, c='#d24049', alpha=0.9, marker='s', s=200)
plt.show()
In [13]:
# Pomoci marker a s nastavime symbol a jeho velikost
fig, ax = plt.subplots(figsize=(10,6))
sns.scatterplot(data=data, x="Brainwt", y="Bodywt", style="Species",
                markers=["<", ">", ".", "^", "v"])
plt.show()
In [14]:
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(
    x='Brainwt', y='Bodywt', data=data, 
    c=[1, 2, 3, 4, 5], alpha=0.9, marker='s', s=200
)
plt.show()
In [15]:
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(
    x='Brainwt', y='Bodywt', data=data, 
    c='#d24049', alpha=0.9, marker='s', s=[100, 300, 500, 700, 900]
)
plt.show()

Přidat popisky

Pomocí ax.set můžeme nastavit limity a popisky os, název grafu, aj.

  • ax.set_xlim a ax.set_ylim nastaví limit x a y osy

  • ax.set_xlabel, ax.set_ylabel nastaví popisky x a y osy

In [16]:
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data)
ax.set(
    xlim=[0, 1400], xlabel='Velikost mozku, g', ylabel='Velikost těla, kg',
    title='Velikost mozku a těla u primátů'
)

plt.show()
In [17]:
data.Brainwt.describe()
Out[17]:
count       5.000000
mean      492.000000
std       483.679129
min       115.000000
25%       179.000000
50%       406.000000
75%       440.000000
max      1320.000000
Name: Brainwt, dtype: float64
In [18]:
# Vytvoříme rozsah hodnot pro osu y
plot_min = data.Brainwt.min() - data.Brainwt.min()*0.2
plot_max = data.Brainwt.max() + data.Brainwt.max()*0.2
plot_min, plot_max
Out[18]:
(92.0, 1584.0)
In [19]:
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data)
ax.set(
    xlim=[plot_min, plot_max], xlabel='Velikost mozku, g', ylabel='Velikost těla, kg',
    title='Velikost mozku a těla u primátů'
)

plt.show()
In [20]:
# Pro anotaci iterujeme přes řádky tabulky
for row_index, row in data.iterrows():
    print(row.Species, row.Bodywt, row.Brainwt)
Potar monkey 10.0 115
Gorilla 207.0 406
Human 62.0 1320
Rhesus monkey 6.8 179
Chimp 52.2 440
In [21]:
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.scatter(x='Brainwt', y='Bodywt', data=data)
ax.set(xlim=[0, 1400], xlabel='Velikost mozku, g', ylabel='Velikost těla, kg',
       title='Velikost mozku a těla u primátů')
# iterrows iteruje přes řádky tabulky
#  V každé iteraci uděláme anotaci jednoho bodu grafu
for i, row in data.iterrows():
    ax.annotate(row.Species, (row.Brainwt, row.Bodywt))

Styly

V matplotlibu můžeme vybrat jeden z několika stylu grafů

In [22]:
print(plt.style.available)
['seaborn-dark', 'seaborn-darkgrid', 'seaborn-ticks', 'fivethirtyeight', 'seaborn-whitegrid', 'classic', '_classic_test', 'fast', 'seaborn-talk', 'seaborn-dark-palette', 'seaborn-bright', 'seaborn-pastel', 'grayscale', 'seaborn-notebook', 'ggplot', 'seaborn-colorblind', 'seaborn-muted', 'seaborn', 'Solarize_Light2', 'seaborn-paper', 'bmh', 'tableau-colorblind10', 'seaborn-white', 'dark_background', 'seaborn-poster', 'seaborn-deep']
In [23]:
plt.style.use('fivethirtyeight')
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data, c=[1, 2, 3, 4, 5], alpha=0.9, marker='s', s=[100, 300, 500, 700, 900])
plt.show()
In [24]:
plt.style.use('dark_background')
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data, c=[1, 2, 3, 4, 5], alpha=0.9, marker='s', s=[100, 300, 500, 700, 900])
plt.show()
In [25]:
plt.style.use('classic')
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data, c=[1, 2, 3, 4, 5], alpha=0.9, marker='s', s=[100, 300, 500, 700, 900])
plt.show()
In [26]:
plt.style.use('seaborn')
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data, c=[1, 2, 3, 4, 5], alpha=0.9, marker='s', s=[100, 300, 500, 700, 900])
plt.show()

Cvičení

Použijte data fossilfuel.csv (popis dat) a nakreslete bodový graf, kde na ose x bude rok a na ose y emise uhlíku z fosilního paliva.

In [27]:
fossil = pd.read_csv('fossilfuel.csv', index_col=0)
fossil
Out[27]:
year carbon
1 1800 8
2 1850 54
3 1900 534
4 1950 1630
5 2000 6611
In [28]:
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='year', y='carbon', data=fossil, c='#d24049')
ax.set(xlabel='Rok', ylabel='Emise uhlíku, mln. ton',
       title='Emise uhlíku z fosilních paliv')
plt.show()

Druhý příklad

Použijeme data sčítání lidu v Kanadě CanPop.csv a uděláme sloupcový graf, kde na x ose bude rok a na ose y počet lidi.

Pro vykreslení použíjeme matplotlib.pyplot.bar

In [29]:
canadian_pop = pd.read_csv('CanPop.csv', index_col=0)
canadian_pop
Out[29]:
year population
1 1851 2.436
2 1861 3.230
3 1871 3.689
4 1881 4.325
5 1891 4.833
6 1901 5.371
7 1911 7.207
8 1921 8.788
9 1931 10.377
10 1941 11.507
11 1951 13.648
12 1961 17.780
13 1971 21.046
14 1981 23.774
15 1991 26.429
16 2001 30.007
In [30]:
# Vytvoříme obrázek
plt.style.use('seaborn')
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
In [31]:
# Přidáme data
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
# edgecolor vykreslí obrysy
ax.bar(x='year', height='population', data=canadian_pop, width=10, color='#f77666', edgecolor='black')
plt.show()
In [32]:
# Upravíme osu x (pootočíme popisky o 45 stupňů)
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.bar(x='year', height='population', data=canadian_pop, width=10, color='#f77666')
plt.xticks(rotation=45)
plt.show()
In [33]:
# Přidáme popisky
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.bar(x='year', height='population', data=canadian_pop, width=10, color='#f77666')
plt.xticks(rotation=45)
ax.set(
    xlabel='Rok', ylabel='Počet lidi v milionech',
    title='Velikost kanadské populace v letech 1851 - 2001'
)
plt.show()
In [34]:
# Přidáme popisky
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.bar(x='year', height='population', data=canadian_pop, width=10, color='#f77666')
plt.xticks(rotation=45)
ax.set(
    xlabel='Rok', ylabel='Počet lidi v milionech',
    # Můžeme použit metodu format
    title='Velikost kanadské populace v letech {} - {}'.format(canadian_pop.year.min(), canadian_pop.year.max())
)
plt.show()
In [35]:
# Přidáme popisky jednotlivých sloupců
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.bar(x='year', height='population', data=canadian_pop, width=10, color='#f77666')
plt.xticks(rotation=45)
ax.set(xlabel='Rok', ylabel='Počet lidi v milionech', title='Velikost kanadské populace v letech 1851 - 2001')
for i, row in canadian_pop.iterrows():
    plt.annotate(row.population, (row.year, row.population), fontweight='bold')
plt.show()
In [36]:
# Přidáme popisky jednotlivých sloupců a zaokrouhlíme
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.bar(x='year', height='population', data=canadian_pop, width=10, color='#f77666')
plt.xticks(rotation=45)
ax.set(xlabel='Rok', ylabel='Počet lidi v milionech',title='Velikost kanadské populace v letech 1851 - 2001')

for i, row in canadian_pop.iterrows():
    plt.annotate(round(row.population, 1), (row.year, row.population), fontweight='bold')
plt.show()
In [37]:
# Přidáme popisky jednotlivých sloupců (dáme na střed)
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.bar(
    x='year', height='population', data=canadian_pop, width=10, 
    color='#f77666', edgecolor='black'
)
plt.xticks(canadian_pop.year, rotation=45)
ax.set(xlabel='Rok', ylabel='Počet lidi v milionech',title='Velikost kanadské populace v letech 1851 - 2001')
for i, row in canadian_pop.iterrows():
    plt.annotate(round(row.population, 1), (row.year-3, row.population), fontweight='bold')
plt.show()
In [38]:
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.bar(
    x='year', height='population', data=canadian_pop, width=10, 
    color='#f77666', edgecolor='black'
)
# Přídáme křívku s body
plt.plot(canadian_pop.year, canadian_pop.population, marker='o')
# Dáme popisky na ose x doprostřed každého sloupce
plt.xticks(canadian_pop.year, rotation=45)
plt.show()
In [39]:
# Vykreslení různobarevné mřížky
fig, ax = plt.subplots(figsize=(8,6), dpi= 80)
ax.bar(
    x='year', height='population', data=canadian_pop, width=10, 
    color='#f77666', edgecolor='black'
)

plt.plot(canadian_pop.year, canadian_pop.population, marker='o')
plt.xticks(canadian_pop.year, rotation=45)
ax.ticklabel_format(style='plain', useLocale=True)
ax.set_yticks([5, 15, 25], minor=False)
ax.set_yticks([10, 20, 30], minor=True)
ax.yaxis.grid(True, which='major', color='b')
ax.yaxis.grid(True, which='minor', color='r')
ax.set_facecolor('white')
plt.show()
In [40]:
# Vykreslení horizontálních přímek
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
ax.bar(
    x='year', height='population', data=canadian_pop, width=10, 
    color='#f77666', edgecolor='black'
)
plt.plot(canadian_pop.year, canadian_pop.population, marker='o')
plt.xticks(canadian_pop.year, rotation=45)
ax.ticklabel_format(style='plain', useLocale=True)
plt.axhline(y=5000000, linewidth=2, color='r', alpha=0.5)
plt.axhline(y=15000000, linewidth=2, color='g')
plt.axhline(y=25000000, linewidth=2, color='b')
# Zabarví podklad na bílo
ax.set_facecolor('white')
plt.show()

Cvičení

Použijte data titanic3.xls a vytvořte sloupcový graf, kde na ose x bude místo nástupu (embarked) a na ose y počet přeživších cestujících.

In [41]:
titanic = pd.read_excel('titanic3.xls')
titanic.head()
Out[41]:
pclass survived name sex age sibsp parch ticket fare cabin embarked boat body home.dest
0 1 1 Allen, Miss. Elisabeth Walton female 29.0000 0 0 24160 211.3375 B5 S 2 NaN St Louis, MO
1 1 1 Allison, Master. Hudson Trevor male 0.9167 1 2 113781 151.5500 C22 C26 S 11 NaN Montreal, PQ / Chesterville, ON
2 1 0 Allison, Miss. Helen Loraine female 2.0000 1 2 113781 151.5500 C22 C26 S NaN NaN Montreal, PQ / Chesterville, ON
3 1 0 Allison, Mr. Hudson Joshua Creighton male 30.0000 1 2 113781 151.5500 C22 C26 S NaN 135.0 Montreal, PQ / Chesterville, ON
4 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female 25.0000 1 2 113781 151.5500 C22 C26 S NaN NaN Montreal, PQ / Chesterville, ON
In [42]:
# Řádky těch, co přežili
titanic[titanic.survived == 1].head(n=3)
Out[42]:
pclass survived name sex age sibsp parch ticket fare cabin embarked boat body home.dest
0 1 1 Allen, Miss. Elisabeth Walton female 29.0000 0 0 24160 211.3375 B5 S 2 NaN St Louis, MO
1 1 1 Allison, Master. Hudson Trevor male 0.9167 1 2 113781 151.5500 C22 C26 S 11 NaN Montreal, PQ / Chesterville, ON
5 1 1 Anderson, Mr. Harry male 48.0000 0 0 19952 26.5500 E12 S 3 NaN New York, NY
In [43]:
# Počet přeživších podle nástupních míst
titanic[titanic.survived == 1].groupby('embarked').count().survived
Out[43]:
embarked
C    150
Q     44
S    304
Name: survived, dtype: int64
In [44]:
# Počet nepřeživších podle nástupních míst
titanic[titanic.survived == 0].groupby('embarked').count().survived
Out[44]:
embarked
C    120
Q     79
S    610
Name: survived, dtype: int64
In [45]:
titanic[titanic.survived == 0].groupby('embarked').count().index
Out[45]:
Index(['C', 'Q', 'S'], dtype='object', name='embarked')
In [46]:
fig, ax = plt.subplots(figsize=(10,6))
ax.bar(
    x=titanic[titanic.survived == 1].groupby('embarked').count().index, 
    height=titanic[titanic.survived == 0].groupby('embarked').count().survived,
    label='Survived'
)
ax.set(
    xlabel='Místo nástupu', 
    ylabel='Počet lidí',
    title='Počet přeživších dle nástupního místa'
)
plt.show()
In [47]:
import numpy as np
embarked = titanic.groupby('embarked').count().index
np.arange(len(embarked))
Out[47]:
array([0, 1, 2])
In [48]:
titanic[titanic.survived == 1].groupby('embarked').count().survived.values
Out[48]:
array([150,  44, 304])
In [49]:
fig, ax = plt.subplots(figsize=(10,6))

plt.bar(
    x=np.arange(len(embarked)) - 0.5, 
    height=titanic[titanic.survived == 1].groupby('embarked').count().survived.values,
    label='Přeživší', width=0.5
)
plt.bar(
    x=np.arange(len(embarked)), 
    height=titanic[titanic.survived == 0].groupby('embarked').count().survived.values,
    label='Nepřeživší', alpha =0.5, width=0.5
)
ax.set(
    xlabel='Místo nástupu', 
    ylabel='Počet lidí',
    title='Počet přeživších a nepřeživších dle nástupního místa'
)
plt.xticks(np.arange(len(embarked))-0.25, embarked)
plt.legend()
plt.show()

Třetí příklad

Použijeme data o Titaniku titanic3.xls a uděláme histogram cen jízdenek.

Pro vykreslení boxplotu použíjeme matplotlib.pyplot.hist

In [50]:
# Načteme data
titanic = pd.read_excel('titanic3.xls')
titanic.head()
Out[50]:
pclass survived name sex age sibsp parch ticket fare cabin embarked boat body home.dest
0 1 1 Allen, Miss. Elisabeth Walton female 29.0000 0 0 24160 211.3375 B5 S 2 NaN St Louis, MO
1 1 1 Allison, Master. Hudson Trevor male 0.9167 1 2 113781 151.5500 C22 C26 S 11 NaN Montreal, PQ / Chesterville, ON
2 1 0 Allison, Miss. Helen Loraine female 2.0000 1 2 113781 151.5500 C22 C26 S NaN NaN Montreal, PQ / Chesterville, ON
3 1 0 Allison, Mr. Hudson Joshua Creighton male 30.0000 1 2 113781 151.5500 C22 C26 S NaN 135.0 Montreal, PQ / Chesterville, ON
4 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female 25.0000 1 2 113781 151.5500 C22 C26 S NaN NaN Montreal, PQ / Chesterville, ON
In [51]:
# Ukážeme popisnou statistiku pro sloupec s cenou jízdenky
titanic.fare.describe()
Out[51]:
count    1308.000000
mean       33.295479
std        51.758668
min         0.000000
25%         7.895800
50%        14.454200
75%        31.275000
max       512.329200
Name: fare, dtype: float64
In [52]:
# Vytvoříme obrázek
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
In [53]:
# Přidáme data
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
plt.hist(titanic.fare, color='#2bae64')
plt.show()
/Users/nasta/.virtualenvs/workshop/lib/python3.6/site-packages/numpy/lib/histograms.py:754: RuntimeWarning: invalid value encountered in greater_equal
  keep = (tmp_a >= first_edge)
/Users/nasta/.virtualenvs/workshop/lib/python3.6/site-packages/numpy/lib/histograms.py:755: RuntimeWarning: invalid value encountered in less_equal
  keep &= (tmp_a <= last_edge)

Chyby invalid value encountered in greater_equal a invalid value encountered in less_equal jsou zpusobeny chybějicími hodnotami v titanic.fare.

Musíme odstranit chybějící hodnoty z titanic.fare.

In [54]:
print(len(titanic.fare))
1309
In [55]:
print(len(titanic.fare.dropna()))
1308
In [56]:
# Přidáme data
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
plt.hist(titanic.fare.dropna(), color='#2bae64')
plt.show()
In [57]:
# Zvětšíme počet sloupců
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
plt.hist(titanic.fare.dropna(), color='#2bae64', bins=70)
plt.show()
In [58]:
# Přidáme popisky
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
plt.hist(titanic.fare.dropna(), color='#2bae64', bins=70)

ax.set(
    xlabel='Cena lístku, USD', 
    title='Distribuce cen lístků na lodi Titanic'
)
plt.show()
In [59]:
# Zvýrazníme sloupec s nejčastější hodnotou
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
plt.hist(titanic.fare.dropna(), color='#2bae64', bins=70)

ax.set(
    xlabel='Cena lístku, USD', 
    title='Distribuce cen lístků na lodi Titanic'
)
ax.patches[1].set_facecolor('#d24049')
plt.show()

Chceme u zvýrazněného sloupce ukázat o které rozmezí hodnot se jedná.

Abychom rozdělily ticket.fare do binů, použijeme pd.cut a následně spočítáme biny pomocí metody value_counts()

In [60]:
# value_counts spočítá četnost hodnot ve sloupci
titanic.embarked.value_counts()
Out[60]:
S    914
C    270
Q    123
Name: embarked, dtype: int64
In [61]:
pd.cut(titanic.fare, 70).value_counts().head()
Out[61]:
(7.319, 14.638]     553
(21.957, 29.276]    166
(-0.512, 7.319]     119
(14.638, 21.957]    115
(29.276, 36.595]     64
Name: fare, dtype: int64
In [62]:
# U sloupce s nejčastější hodnotou napíšeme rozmezí hodnot
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
plt.hist(titanic.fare.dropna(), color='#2bae64', bins=70)

ax.set(
    xlabel='Cena lístku, USD', 
    title='Distribuce cen lístků na lodi Titanic'
)
ax.patches[1].set_facecolor('#d24049')
plt.text(2, 570, '7.319 - 14.638')
plt.show()

Cvičení

Použijete data o Titaniku titanic3.xls a vytvořte histogram věku cestujících (age).

In [63]:
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
plt.hist(titanic.age.dropna(), color='#2bae64', bins=70)

ax.set(
    xlabel='Věk', 
    title='Distribuce věku cestujících na lodi Titanic'
)

plt.show()

Čtvrtý příklad

Použijeme data o Titaniku titanic3.xls a uděláme boxplot věků cestujících (age) v různých třídách (pclass). Pro vykreslení boxplotu použíjeme seaborn.boxplot

In [64]:
# Načteme data
titanic = pd.read_excel('titanic3.xls')
titanic.head()
Out[64]:
pclass survived name sex age sibsp parch ticket fare cabin embarked boat body home.dest
0 1 1 Allen, Miss. Elisabeth Walton female 29.0000 0 0 24160 211.3375 B5 S 2 NaN St Louis, MO
1 1 1 Allison, Master. Hudson Trevor male 0.9167 1 2 113781 151.5500 C22 C26 S 11 NaN Montreal, PQ / Chesterville, ON
2 1 0 Allison, Miss. Helen Loraine female 2.0000 1 2 113781 151.5500 C22 C26 S NaN NaN Montreal, PQ / Chesterville, ON
3 1 0 Allison, Mr. Hudson Joshua Creighton male 30.0000 1 2 113781 151.5500 C22 C26 S NaN 135.0 Montreal, PQ / Chesterville, ON
4 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female 25.0000 1 2 113781 151.5500 C22 C26 S NaN NaN Montreal, PQ / Chesterville, ON

Nejprve se podíváme na data, která chceme vykreslit.

Projdeme všechny unikátní hodnoty pclass a zobrazíme popisnou statistiku.

In [65]:
 for pclass in titanic.pclass.unique():
        print('pclass ', pclass, titanic[titanic.pclass == pclass].age.describe())
pclass  1 count    284.000000
mean      39.159918
std       14.548059
min        0.916700
25%       28.000000
50%       39.000000
75%       50.000000
max       80.000000
Name: age, dtype: float64
pclass  2 count    261.000000
mean      29.506705
std       13.638628
min        0.666700
25%       22.000000
50%       29.000000
75%       36.000000
max       70.000000
Name: age, dtype: float64
pclass  3 count    501.000000
mean      24.816367
std       11.958202
min        0.166700
25%       18.000000
50%       24.000000
75%       32.000000
max       74.000000
Name: age, dtype: float64
In [66]:
# Vytvoříme obrázek
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
In [67]:
# Přidáme data
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
sns.boxplot(x='pclass', y='age', data=titanic)
plt.show()
In [68]:
# Přidáme popisky
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
sns.boxplot(x='pclass', y='age', data=titanic)

ax.set(
    xlabel='Třída cestujících', 
    ylabel='Věk',
    title='Distribuce věku cestujících v různých třídách'
)
plt.show()

Cvičení

Použijete data o Titaniku titanic3.xls a vytvořte boxplot ceny lístků (fare) v různých třídách (pclass).

In [69]:
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
sns.boxplot(x='pclass', y='fare', data=titanic)

ax.set(
    xlabel='Třída cestujících', 
    ylabel='Cena lístků',
    title='Distribuce ceny lístků cestujících v různých třídách'
)
plt.show()
In [70]:
# Nastavíme menší rozsah osy y, aby byly boxploty lépe vidět 
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
sns.boxplot(x='pclass', y='fare', data=titanic)

ax.set(
    xlabel='Třída cestujících', 
    ylabel='Cena lístků',
    title='Distribuce ceny lístků cestujících v různých třídách'
)
plt.ylim([0, 300])
plt.show()
In [71]:
# Nekteří cestující neplatili za listek - u boxplotů vidíme nulové hodnoty
titanic[titanic.fare == 0]
# Jednalo se zamestnance nebo lidi, kteří dostali listek zadarmo, protože byli součástí White Star Line
Out[71]:
pclass survived name sex age sibsp parch ticket fare cabin embarked boat body home.dest
7 1 0 Andrews, Mr. Thomas Jr male 39.0 0 0 112050 0.0 A36 S NaN NaN Belfast, NI
70 1 0 Chisholm, Mr. Roderick Robert Crispin male NaN 0 0 112051 0.0 NaN S NaN NaN Liverpool, England / Belfast
125 1 0 Fry, Mr. Richard male NaN 0 0 112058 0.0 B102 S NaN NaN NaN
150 1 0 Harrison, Mr. William male 40.0 0 0 112059 0.0 B94 S NaN 110.0 NaN
170 1 1 Ismay, Mr. Joseph Bruce male 49.0 0 0 112058 0.0 B52 B54 B56 S C NaN Liverpool
223 1 0 Parr, Mr. William Henry Marsh male NaN 0 0 112052 0.0 NaN S NaN NaN Belfast
234 1 0 Reuchlin, Jonkheer. John George male 38.0 0 0 19972 0.0 NaN S NaN NaN Rotterdam, Netherlands
363 2 0 Campbell, Mr. William male NaN 0 0 239853 0.0 NaN S NaN NaN Belfast
384 2 0 Cunningham, Mr. Alfred Fleming male NaN 0 0 239853 0.0 NaN S NaN NaN Belfast
410 2 0 Frost, Mr. Anthony Wood "Archie" male NaN 0 0 239854 0.0 NaN S NaN NaN Belfast
473 2 0 Knight, Mr. Robert J male NaN 0 0 239855 0.0 NaN S NaN NaN Belfast
528 2 0 Parkes, Mr. Francis "Frank" male NaN 0 0 239853 0.0 NaN S NaN NaN Belfast
581 2 0 Watson, Mr. Ennis Hastings male NaN 0 0 239856 0.0 NaN S NaN NaN Belfast
896 3 0 Johnson, Mr. Alfred male 49.0 0 0 LINE 0.0 NaN S NaN NaN NaN
898 3 0 Johnson, Mr. William Cahoone Jr male 19.0 0 0 LINE 0.0 NaN S NaN NaN NaN
963 3 0 Leonard, Mr. Lionel male 36.0 0 0 LINE 0.0 NaN S NaN NaN NaN
1254 3 1 Tornquist, Mr. William Henry male 25.0 0 0 LINE 0.0 NaN S 15 NaN NaN
In [72]:
# Načteme data
data = pd.read_csv(
    'http://vincentarelbundock.github.io/Rdatasets/csv/datasets/WorldPhones.csv',
#     index_col=0
)
#Přejmenujeme sloupce
data.rename(columns={'Unnamed: 0':'Year'}, inplace=True)
data
Out[72]:
Year N.Amer Europe Asia S.Amer Oceania Africa Mid.Amer
0 1951 45939 21574 2876 1815 1646 89 555
1 1956 60423 29990 4708 2568 2366 1411 733
2 1957 64721 32510 5230 2695 2526 1546 773
3 1958 68484 35218 6662 2845 2691 1663 836
4 1959 71799 37598 6856 3000 2868 1769 911
5 1960 76036 40341 8220 3145 3054 1905 1008
6 1961 79831 43173 9053 3338 3224 2005 1076
In [73]:
# Můžeme proiterovat všemi sloupcí kromě Year abychom vytvořili graf
data.columns[1:]
Out[73]:
Index(['N.Amer', 'Europe', 'Asia', 'S.Amer', 'Oceania', 'Africa', 'Mid.Amer'], dtype='object')
In [74]:
fig, ax = plt.subplots()
for column in data.columns[1:]:
    # Pro každy region se vykreslí křívka do stejného grafu
    plt.plot(data.Year, data[column], marker='.', label=column)
    plt.ylim(0, 80000)  
# Nastavíme, aby se správně zobrazovaly roky
plt.xticks(data.Year, data.Year.astype(str), rotation=45)
ax.set(
    xlabel='Rok', ylabel='Počet telefonů (tis.)', 
    title='Celosvětový počet telefonů v letech {} - {}'.format(data.Year.min(), data.Year.max())
)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.show()