Kuviot ja kaaviot Pythonilla

Päivitetty 23.11.2022

Tehdään aluksi selväksi kuvion (figure) ja kaavion (axes) ero. Kuviota voit ajatella kehykseksi, jonka sisällä on yksi tai useampia kaavioita. Kuvion ja kaavion suhdetta toisiinsa kuvaa oheinen osoitteesta https://realpython.com/python-matplotlib-guide/ lainattu havainnollistus:

matplotlib1

Kaavion laadinnassa ja muotoilussa päähuomio kiinnittyy kaavioon eli Axes-olioon ja sen sisältämiin olioihin. Kuvioon eli Figure-olioon huomio kiinnittyy esimerkiksi kuvion koon määrittelyssä ja usean kaavion kuvioita laadittaessa.

Kuvioiden ja kaavioiden peruskirjasto on matplotlib.pyplot. Sen lisäksi kannattaa opetella käyttämään matplotlibin varaan rakennettua seaborn-kirjastoa. Näiden kirjastojen tuonti sujuu seuraavasti:

import matplotlib.pyplot as plt
import seaborn as sns

Jos kaaviot eivät tulostu näkyviin Jupyter notebookissa, niin lisää kirjastojen tuonnin jälkeen komento %matplotlib inline (yleensä tätä ei tarvita).

Matplotlib

Pandas-kirjastossa on oma helppokäyttöinen käyttöliittymä matplotlib-grafiikkaan. Voin luoda kaavion suoraan dataframesta tai dataframen sarakkeesta. Esimerkiksi pystypylväskaavion (bar) voin luoda:

df.plot.bar()

Muita usein käytettyjä kaaviolajeja ovat barh (vaakapylväs), pie (piirakka) ja line (viiva). Viivakaavio on oletuksena, jos kaaviolajin nimi jätetään pois ( df.plot() )

Kaavion luonnin yhteydessä voin tehdä kaavioon liittyviä asetuksia parametreilla, esimerkiksi:

  • figsize arvoksi voin asettaa kuvion leveyden ja korkeuden, esimerkiksi (6, 4)
  • legend arvoksi voin asettaa False tai ’reverse’. Oletusarvona on True. legend=’reverse’ kääntää selitteen arvojen järjestyksen.
  • width arvoksi voin asettaa luvun väliltä 0 – 1. Oletusarvona on 0.5. Mitä suurempi arvo, sitä lähempänä toisiaan ja sitä paksumpia pylväät ovat. Jos width=1, niin pylväät ovat kiinni toisissaan.
  • rot kääntää luokka-akselin jakoviivojen (ticks) nimiöt annetun asteluvun mukaan. Esimerkiksi rot=45 kääntää nimiöt 45 asteen kulmaan.
  • stacked=True luo pinotun pylväskaavion.
  • color määrittää pylväiden värin. Esimerkiksi color=’C0′ asettaa väriksi käytössä olevan väripaletin ensimmäisen värin. Voin käyttää värien nimiä tai koodeja.
  • style määrittää viivakaavion viivan ja havaintopisteiden tyylin. Esimerkiksi style=’ro-’ tekee punaisen (r) viivan (), jossa havaintopisteet ovat ympyröitä (o). Lisätietoa https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.plot.html
  • edgecolor määrittää pylväiden reunan värin.

Lisätietoa ominaisuuksista, jotka voit asettaa parametreilla:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html

Parametrien lisäksi voin muotoilla kaaviota matplotlib.pyplot-funktioilla. Esimerkiksi kaavion otsikon voin lisätä komennolla plt.title(’Kaavion otsikko’). Funktiot kohdistuvat aina viimeksi luotuun kaavioon. Lisätietoa:

https://matplotlib.org/stable/tutorials/introductory/pyplot.html

Jos tarvitsen muotoiluja, joita en pääse tekemään plt-funktioilla, niin sijoitan kaavion muuttujan arvoksi, jotta voin viitata kaavioon myöhemmin.

ax = df.plot.bar()

Jos aion viitata myöhemmin myös kuvioon (figure), niin voin ennen kaavion määrittelyä luoda ”tyhjän kuvion ja kaavion” plt.subplots-funktiolla. plt.subplots() palauttaa sekä kuvion (jolle seuraavassa annettu nimi fig) että kaavion (jolle seuraavassa annettu nimi ax). Kaavion laadinnassa ilmoitan ax-parametrin arvona kaavion nimen:

fig, ax = plt.subplots()
df.plot.bar(ax = ax)

Vaihtoehtoisesti voin viitata kuvioon ja kaavioon käyttämällä funktioita plt.gcf() (get current figure) ja plt.gca() (get current axes).

Seaborn

Jos teen kaavioita lasketuista yhteenvetotaulukoista (frekvenssitaulukko, ristiintaulukointi jne.), niin käytän edellä kuvattuja tapoja. Jos taas teen kaavion suoraan raakadatasta, niin käytän yleensä seaborn-kirjaston kaaviolajeja. Seaborn-kaavioita voin muotoilla tavallisten matplotlib-kaavioiden tapaan plt-funktioilla. Myös monet kaavion luonnin matplotlib-parametrit ovat käytettävissä.

Seaborn-kaavion luontitoiminnossa figsize-parametri ei ole käytössä. Jos kuvion koko halutaan määrittää, niin se pitää tehdä luomalla kuvio ennen seaborn-kaavion laadintaa. Seuraava esimerkki kuvaa määrätyn kokoisen countplot-kaavion laatimista tips-nimisen dataframen size-nimisestä muuttujasta.

plt.figure(figsize=(6, 4))
sns.countplot(x='size', data=tips)

Seaborn-kaavioita on mukava laatia kunhan pääset sinuiksi käytetyimpien parametrien kanssa:

  • x (x-akselin muuttuja)
  • y (y-akselin muuttuja)
  • hue (minkä muuttujan mukaan värierottelu)
  • data (dataframe)

Seuraavaksi

Pääset hyvään alkuun käymällä läpi seitsemän muistiota Matplotlib perusteista. Aloita tästä:

https://nbviewer.jupyter.org/github/taanila/kaaviot/blob/master/matplotlib1.ipynb

Seaborn-kaavioiden opiskelun voit aloittaa tästä:

https://nbviewer.org/github/taanila/kaaviot/blob/master/seaborn.ipynb