MIKKO RAHIKKA

The electrical things have their lives too, paltry as those lives are.


Kuvaajia Pythonin Matplotlib kirjastolla + xkcd-kuvaajat

[edit. 3.3.24. lisäsin kuvaajan, jossa on oppikirjatyyliset koordinaattiakselit nimet paikallaan.]

Tässä on muutama esimerkki kuvaajien piirtämisestä Matplotlib ja NumPy-kirjastojen avulla. Aina kun piirrän kuvaajia Matplotlibillä, niin kopioin koodin jostain vanhasta omasta koodistani, kirjasta tai sitten googletan ohjeita.

Kun joskus kauan sitten (viime vuosikymmenellä?) aloin piirtää kuvaajia Pythonilla, niin minulle suurin ongelma oli sisäistää Matplotlibin tapa käyttää listoja koordinaatteina. Esimerkiksi GeoGebrassa ja monessa muussa ohjelmassa pisteet tasossa esitetään kaksikkoina tyyliin (2, 5), (3, 7), (4, 13) jne. Matplotlib käsittelee x ja y-koordinaatit erikseen listoina tyyliin [2, 3, 4] ja [5, 7, 13].

pisteitä ja viivoja koordinaatistoon

Aloitetaan yksinkertaisella esimerkillä. Piirretään Matplotlibillä pisteitä eri koordinaatteihin ja niiden väliin janoja. Tässä esimerkissä näkyy, miten Matplotlib skaalaa automaattisesti kuvaajan.

Koodissa rivillä 3 luetaan Matplotlib-kirjasto.

Riveillä 6 ja 7 luodaan listat pisteiden x ja y koordinaateista. 

Rivillä 10 luodaan scatter-funktion avulla pisteet koordinaatistoon ja rivillä 12 plot-funktion avulla janat pisteiden välille.

Riveillä 11-13 määritellään otsikot.

Rivin 18 show-funktio tuottaa kuvaajan.

pentagrammi

Piirretään viisikulmio ja luodaan sen avulla pentagrammi.

Rivillä 2 ladataan Math-kirjaston sqrt()-funktio neliöjuuren laskemista varten.

Riveillä 5- 8 on laskettu origoon piirrettyyn yksikköympyrään piirretyn viisikulmion kärkien koordinaattien tarkat arvot. Tässä käytin apuna kynää ja paperia sekä GeoGebran CASia. Pitkät rivit on katkaistu kenoviivalla \.

Riveillä 11 ja 12 on järjestetty pisteet uudelleen uusiksi listoiksi, siten että ne muodostavat viisikannan.

Riveillä 14 ja 15 piirretään janat ja määritellään niiden ulkoasu.

Riveillä 17 – 21 poistetaan koordinaattiakselit näkyviltä, muokataan kuvan skaalausta ja määritellään otsikot.

funktion kuvaaja

Tehdään ensin yksinkertainen kuvaaja NumPy-kirjaston avulla. NumPya käytetään, kun tarvitaan vektoreita (array) tai matriiseja matemaattisen laskennan apuna. Tällä tavalla Pythonin saa toimimaan samalla tavalla kuin GeoGebra, kun funktion syötteenä on lista. Aika usein on tapana luoda funktion kuvaajissa tarvittavat x ja y-koordinaatit tällä menetelmällä.

GeoGebran listan toinen potenssi.

NumPyn vektorin toinen potenssi.

Riveillä 1-2 luetaan tarvittavat kirjastot. 

Rivillä 4 luodaan x-koordinaatit NumPyn vektorina, jossa on luvut [-1, -0.9, …, 4.9, 5.0, 5.1].

Riveillä 5 ja 6 tuotetaan funktioiden x2 ja (5 – x)*x kuvaajat.

Piirretään seuraavaksi hieman ”tyylikkäämpi” kuvaaja. Tässä määritellään oma funktio f(x) = x*sin(x2) ja piirretään sen kuvaaja. Lisätään kuvaajaan myös perinteiset x ja y-akselit. NumPyssä on sisäänrakennettuna runsaasti matemaattisia funktioita, jotka toimivat oikein laskettaessa vektorien avulla. Kun funktioita käyttää, niin alkuun tulee lisätä np tyyliin np.sqrt(), np.sin(), np.arcsin(), …

Riveillä 1-2 ladataan tarvittavat kirjastot. Huomaa, että Math-kirjastoa ei ladata, sen sin()-funktio ei toimi NumPyn vektoreiden kanssa oikein. Rivillä 10 käytetään NumPy:n sini-funktiota np.sin().

Rivillä 6 luodaan pisteiden x-koordinaateille vektori. Vektorilla x on arvot
[-1. -0.98 -0.96 …  8.96  8.98  9].  

Riveillä 9-10 luodaan piirrettävä funktio f(x) = x*sin(x2). Rivillä 12 luodaan vektori y, jossa on x-koordinaatteja vastaavat funktion arvot eli y-koordinaatit.

Loppu onkin kuvaajan piirtoa. Riveillä 15-18 luodaan kuvaajalle perinteiset x- ja y-akselit, määritellään värit ja viivojen  leveydet. Jos rivin 19 kommentti-merkin # jättää pois, niin silloin syntyvän kuvaajan  x- ja y-koordinaattien skaalaus olisi sama.

Riveillä 21-22 luodaan koordinaatistoon ruudukko, riveillä 23-24 määritellään piirtoalue, riveillä 25-27 tuotetaan otsikot ja rivillä 28 määritellään kuvaaja.

Lisään vielä edelliseen kuvaajaan nuolet koordinaattiakseleiden päihin ja nimet kohdilleen. Lähdekoodi on mukana Colab-tiedostossa, linkki on ensimmäisenä lähteissä.

histogrammi ja pylväitä

Heitetään viittä noppaa ja lasketaan niiden summa. Toistetaan tätä 10000 kertaa ja piirretään summien jakauma. Tässä esimerkissä näkyy, että NumPyn vektoreita käytettäessä ei tarvita yleensä for-silmukoita kun toistetaan samaa asiaa.

Rivillä 5 on toistojen lukumäärä.

Riveillä 8-12 arvotaan kunkin heittokierroksen ensimmäisen, toisen, … ja viidennen nopan arvo. Funktio randint(6, N) arpoo N kappaletta lukuja 0, 1, … 5. Lisäämällä niihin 1 saadaan satunnaisia lukuja 1, 2, …, 6.

Rivillä 14 lasketaan heittosarjojen summat.

Rivillä 17 luodaan jakauma ja piirretään siitä histogrammi.

Hist-funktio jakaa oletusasetuksillaan luvut tässä tapauksessa 10 luokkaan. Kun katsoo jakauman reunoja, niin huomaa että siellä on jotain omituista, sillä pienin tulos on 5 ja suurin 30. Histogrammin vasen reuna alkaa pienimmästä luvusta ja oikea reuna päättyy suurimpaan lukuun.

Muokataan edellisen koodin kuvaajanpiirto-osaa. Luokitellaan arvot luokkiin 5, 6, …, 30. 

Rivillä 17 tuotetaan luokkien reunat. Mieti itse, miksi tuohon lausekkeeseen pitää lisätä kaksi. Reunat-vektorissa on arvot
[ 4.5  5.5  … 29.5 30.5]

Rivillä 18 luodaan histogrammi, jonka sisustaa ei ole väritetty histtype = ”step”, align = ”mid” laittaa akselin arvot oikeaan paikkaan.

pylväsdiagrammi

Piirretään vielä pylväsdiagrammi.

Rivillä 18 määritellään pylväsdiagrammi, density=True kertoo, että lasketaan suhteelliset frekvenssit ja histtype = ”bar” tuottaa pylväät.

xkcd-kuvaajat

Jos haluaa muuttaa kuvaajat näyttämään Randall Munroen xkcd-sarjakuvissa käytettyjen kuvaajien näköisiksi, niin xkcd-funktio auttaa. Kuvaajissa käytetyssä fontissa ei ole ääkkösiä.

Muokataan ensimmäisen esimerkin koodia. Lisäsin koodin alkuun kaksi riviä. Niiden avustuksella ei tule virheilmoituksia fontteihin liittyen. Rivillä 14 määritellään kuvaajien ulkoasuksi xkcd.

Alla tämän artikkelin muut kuvaajat muokattuna xkcd-funktiolla.

lähteet

Koodit Google Colabissa
https://colab.research.google.com/drive/1cSir1OjDvIqcPDjWe7UhsM3S7uRRuojd?usp=sharing

Matplotlib histograms
https://matplotlib.org/stable/gallery/statistics/hist.html#sphx-glr-gallery-statistics-hist-py

Tutorialspoint NumPy – Matplotlib
https://www.tutorialspoint.com/numpy/numpy_matplotlib.htm

NumPy Mathematical functions
https://numpy.org/doc/stable/reference/routines.math.html#mathematical-functions

xkcd
https://xkcd.com

XKCD — Matplotlib 3.8.2 documentation
https://matplotlib.org/stable/gallery/showcase/xkcd.html

Kalilur Rahman. Python Data Visualization Essentials Guide. BPB Online. 2021

Jake VanderPlas. Python Data Science Book. O’Reilly. 2022

1D satunnaiskävely Pythonilla & histogrammeja – osa 2
https://mikkorahikka.blog/2022/04/27/1d-satunnaiskavely-pythonilla-histogrammeja-osa-2/

Noppien summa GeoGebralla – n noppaa
https://mikkorahikka.blog/2020/05/05/noppien-summa-n-noppaa/

2 vastausta artikkeliin “Kuvaajia Pythonin Matplotlib kirjastolla + xkcd-kuvaajat”

  1. […] Kuvaajia Pythonin Matplotlib kirjastolla + xkcd-kuvaajat -blogiartikkelinihttps://mikkorahikka.blog/2024/03/02/kuvaajia-pythonin-matplotlib-kirjastolla-xkcd-kuvaajat/ […]

    Tykkää

  2. […] Kuvaajia Pythonin Matplotlib kirjastolla + xkcd-kuvaajathttps://mikkorahikka.blog/2024/03/02/kuvaajia-pythonin-matplotlib-kirjastolla-xkcd-kuvaajat/ […]

    Tykkää

Jätä kommentti

This site uses Akismet to reduce spam. Learn how your comment data is processed.