from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2023-12-10 / Aki Taanila
Tämä on jatkoa sarjan edellisille osille
Värejä voin vaihtaa yksi kerrallaan värin nimen, RGB-koodin tai HEX-koodin mukaan.
Nykyisessä versiossa oletusvärit määritellään HEX-koodeina: https://matplotlib.org/users/dflt_style_changes.html#colors-color-cycles-and-color-maps. Esimerkiksi pylväskaaviossa ensimmäinen arvosarja esitetään ensimmäisen värin mukaisesti, toinen arvosarja toisen värin mukaisesesti jne. HEX-koodin sijasta oletusväreihin voin viitata lyhyemmin 'C0', 'C1', 'C2' jne.
Seuraavassa käytän esimerkkinä 5-portaisella asteikolla mitattuja tyytyväisyyksiä johtoon, työtovereihin, työympäristöön, palkkaan ja työtehtäviin. Laadin ensin prosenttitaulukon, johon on koottuna vastaukset prosentteina ja kuvaan ne pinottuna pylväskaaviona. Kaavioiden muotoiluun en tässä kiinnitä huomiota, vaan keskityn väreihin.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('https://taanila.fi/data1.xlsx')
df.head()
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 38 | 1 | 1.0 | 22.0 | 3587 | 3 | 3.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN |
1 | 2 | 1 | 29 | 2 | 2.0 | 10.0 | 2963 | 1 | 5.0 | 2 | 1 | 3 | NaN | NaN | NaN | NaN |
2 | 3 | 1 | 30 | 1 | 1.0 | 7.0 | 1989 | 3 | 4.0 | 1 | 1 | 3 | 1.0 | NaN | NaN | NaN |
3 | 4 | 1 | 36 | 2 | 1.0 | 14.0 | 2144 | 3 | 3.0 | 3 | 3 | 3 | 1.0 | NaN | NaN | NaN |
4 | 5 | 1 | 24 | 1 | 2.0 | 4.0 | 2183 | 2 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN |
# Taulukon laskeminen
df1 = df['johto'].value_counts(normalize=True).sort_index().to_frame()
df1['työtov'] = df['työtov'].value_counts(sort=False, normalize=True)
df1['työymp'] = df['työymp'].value_counts(sort=False, normalize=True)
df1['palkkat'] = df['palkkat'].value_counts(sort=False, normalize=True)
df1['työteht'] = df['työteht'].value_counts(sort=False, normalize=True)
df1.index = ['Erittäin tyytymätön', 'Jokseenkin tyytymätön', 'Ei tyytymätön eikä tyytyväinen',
'Jokseenkin tyytyväinen', 'Erittäin tyytyväinen']
df1 = df1.T * 100
df1
Erittäin tyytymätön | Jokseenkin tyytymätön | Ei tyytymätön eikä tyytyväinen | Jokseenkin tyytyväinen | Erittäin tyytyväinen | |
---|---|---|---|---|---|
proportion | 8.536585 | 19.512195 | 36.585366 | 28.048780 | 7.317073 |
työtov | NaN | 3.703704 | 19.753086 | 43.209877 | 33.333333 |
työymp | 10.975610 | 10.975610 | 36.585366 | 28.048780 | 13.414634 |
palkkat | 40.243902 | 23.170732 | 23.170732 | 12.195122 | 1.219512 |
työteht | 6.097561 | 18.292683 | 35.365854 | 30.487805 | 9.756098 |
Jos en määritä värejä, niin käytössä ovat 5 ensimmäistä oletusväriä.
print('Oletusvärien HEX-koodit:\n', plt.rcParams['axes.prop_cycle'].by_key()['color'])
t = np.arange(5)
cmap = plt.get_cmap('tab10')
for i in range(5):
plt.plot(t, i*(t+1), color=cmap(i), linestyle='-')
plt.plot(t, i*(t+1)+.3, color=cmap(i), linestyle=':')
plt.title('Viisi ensimmäistä oletusväriä')
Oletusvärien HEX-koodit: ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']
Text(0.5, 1.0, 'Viisi ensimmäistä oletusväriä')
df1.plot(kind='barh', stacked=True, width=0.8, legend=False)
plt.title('Kaavio oletusväreillä')
Text(0.5, 1.0, 'Kaavio oletusväreillä')
Voin määrittää käytettävät värit listana käyttäen värien nimiä, RGB-koodeja tai HEX-koodeja.
colors = ['darkred', 'red', 'gray', 'blue', 'darkblue']
df1.plot(kind='barh', stacked=True, width=0.8, legend=False, color=colors)
<Axes: >
Matplotlibin värikarttoja: https://matplotlib.org/stable/tutorials/colors/colormaps.html
# Esimerkki sequential-tyyppisestä värikartasta
df1.plot(kind='barh', stacked=True, width=0.8, legend=False, colormap='Greens')
<Axes: >
# Esimerkki diverging-tyyppisestä värikartasta
df1.plot(kind='barh', stacked=True, width=0.8, legend=False, colormap='coolwarm')
<Axes: >
# Esimerkki qualitative-tyyppisestä värikartasta
df1.plot(kind='barh', stacked=True, width=0.8, legend=False, colormap='Set1')
<Axes: >
Esimerkkikaavioissamme värikartasta poimitaan tasaisin välein viisi väriä. Voin supistaa värikarttaa rajaamalla alkuperäisen värialueen 0 - 1 suppeammaksi, esimerkiksi 0.2 - 0.8.
# Värikartan inferno alueelta 0.2 - 0.8 viisi väriä
colors = plt.cm.inferno(np.linspace(0.2, 0.8, 5))
df1.plot(kind='barh', stacked=True, width=0.8, legend=False, color=colors)
<Axes: >
# Jos valitsen viiden sijasta kymmenen väriä, niin viiden värin kuvioon otetaan vain viisi ensimmäistä väriä
colors = plt.cm.inferno(np.linspace(0.3, 0.7, 10))
df1.plot(kind='barh', stacked=True, width=0.8, legend=False, color=colors)
<Axes: >
Seuraava osa https://nbviewer.jupyter.org/github/taanila/kaaviot/blob/master/matplotlib5.ipynb käsittelee kaavioiden oletuspatrametreja, kuten fontteja ja fonttikokoja