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
Vytvořit obrázek
Přidat data - přímky, body, sloupce, atd.
Přidat popisky os, celého obrázku, text do grafu
import matplotlib.pyplot as plt
import seaborn as sns
# Následujicí řádek je potřeba pro zobrazení matplotlib grafů v Jupyter notebooku
%matplotlib inline
cars = sns.load_dataset('car_crashes')
cars.head()
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 |
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
import pandas as pd
data = pd.read_csv('primates.csv')
data.rename(index=str, columns={'Unnamed: 0': 'Species'}, inplace=True)
data
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 |
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)
fig, ax = plt.subplots()
fig, ax = plt.subplots(figsize=(10,6))
fig, ax = plt.subplots(2)
ax.scatter
vytvoří bodový graf
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x='Brainwt', y='Bodywt', data=data)
<matplotlib.collections.PathCollection at 0x11ac03748>
# 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])
<matplotlib.collections.PathCollection at 0x11adaa5f8>
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(x=data.Brainwt, y=data.Bodywt)
<matplotlib.collections.PathCollection at 0x11adfec50>
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()
# 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()
# 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()
# 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()
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()
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()
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
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()
data.Brainwt.describe()
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
# 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
(92.0, 1584.0)
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()
# 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
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))
V matplotlibu můžeme vybrat jeden z několika stylu grafů
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']
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()
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()
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()
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()
fossil = pd.read_csv('fossilfuel.csv', index_col=0)
fossil
year | carbon | |
---|---|---|
1 | 1800 | 8 |
2 | 1850 | 54 |
3 | 1900 | 534 |
4 | 1950 | 1630 |
5 | 2000 | 6611 |
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()
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
canadian_pop = pd.read_csv('CanPop.csv', index_col=0)
canadian_pop
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 |
# Vytvoříme obrázek
plt.style.use('seaborn')
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
# 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()
# 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()
# 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()
# 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()
# 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()
# 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()
# 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()
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()
# 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()
# 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()
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.
titanic = pd.read_excel('titanic3.xls')
titanic.head()
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 |
# Řádky těch, co přežili
titanic[titanic.survived == 1].head(n=3)
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 |
# Počet přeživších podle nástupních míst
titanic[titanic.survived == 1].groupby('embarked').count().survived
embarked C 150 Q 44 S 304 Name: survived, dtype: int64
# Počet nepřeživších podle nástupních míst
titanic[titanic.survived == 0].groupby('embarked').count().survived
embarked C 120 Q 79 S 610 Name: survived, dtype: int64
titanic[titanic.survived == 0].groupby('embarked').count().index
Index(['C', 'Q', 'S'], dtype='object', name='embarked')
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()
import numpy as np
embarked = titanic.groupby('embarked').count().index
np.arange(len(embarked))
array([0, 1, 2])
titanic[titanic.survived == 1].groupby('embarked').count().survived.values
array([150, 44, 304])
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()
Použijeme data o Titaniku titanic3.xls
a uděláme histogram cen jízdenek.
Pro vykreslení boxplotu použíjeme matplotlib.pyplot.hist
# Načteme data
titanic = pd.read_excel('titanic3.xls')
titanic.head()
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 |
# Ukážeme popisnou statistiku pro sloupec s cenou jízdenky
titanic.fare.describe()
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
# Vytvoříme obrázek
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
# 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
.
print(len(titanic.fare))
1309
print(len(titanic.fare.dropna()))
1308
# Přidáme data
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
plt.hist(titanic.fare.dropna(), color='#2bae64')
plt.show()
# 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()
# 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()
# 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()
# value_counts spočítá četnost hodnot ve sloupci
titanic.embarked.value_counts()
S 914 C 270 Q 123 Name: embarked, dtype: int64
pd.cut(titanic.fare, 70).value_counts().head()
(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
# 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()
Použijete data o Titaniku titanic3.xls
a vytvořte histogram věku cestujících (age
).
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()
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
# Načteme data
titanic = pd.read_excel('titanic3.xls')
titanic.head()
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.
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
# Vytvoříme obrázek
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
# Přidáme data
fig, ax = plt.subplots(figsize=(10,6), dpi= 80)
sns.boxplot(x='pclass', y='age', data=titanic)
plt.show()
# 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()
Použijete data o Titaniku titanic3.xls
a vytvořte boxplot ceny lístků (fare
) v různých třídách (pclass
).
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()
# 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()
# 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
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 |
# 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
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 |
# Můžeme proiterovat všemi sloupcí kromě Year abychom vytvořili graf
data.columns[1:]
Index(['N.Amer', 'Europe', 'Asia', 'S.Amer', 'Oceania', 'Africa', 'Mid.Amer'], dtype='object')
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()