Dataframe matplotlib-grafiikaksi - perusasiat

Seuraavassa teen kaaviot suoraan dataframesta ja käytän muotoiluun Axes-oliota.

In [1]:
#tuon kirjastot
import pandas as pd
import matplotlib.pyplot as plt

#seuraavan ansiosta kaaviot tulostuvat Jupyter-notebookiin ilman erillistä komentoa
%matplotlib inline
In [2]:
#luon dataframen
df1 = pd.DataFrame({'Myynti 2017': [1321847, 852669, 1032199, 568230]},
                  index = ['Helsinki', 'Turku', 'Tampere', 'Oulu'])
df1
Out[2]:
Myynti 2017
Helsinki 1321847
Turku 852669
Tampere 1032199
Oulu 568230

Dataframesta kaavioksi

  • df.plot() luo oletuksena viivakaavion
  • Muita kaaviolajeja df.plot.bar(), df.plot.barh(), df.plot.hist(), df.plot.scatter(), df.box()
  • Jos aiot muotoilla kaaviota, niin sijoita se muuttujaan. Kaavion luonti palauttaa axes-luokan olion.
In [3]:
#myynnit vaakapylväskaaviona
df1.plot.barh()
Out[3]:
<matplotlib.axes._subplots.AxesSubplot at 0x24bc1142ac8>
In [4]:
#pientä tuunausta kaavion luonnin yhteyteen (selite piiloon, pylvään leveyden määritys)
ax1 = df1.plot.barh(legend=False, width=0.7)

#otsikoita
ax1.set_title('Myynnit vuonna 2017')
ax1.set_xlabel('Miljoonaa euroa')

#haen x-akselin ticksit ja muotoilen miljooniksi yhdellä desimaalilla
ax1.set_xticklabels(['{:.1f}'.format(x/1000000) for x in ax1.get_xticks()])

#taustaviivoitus x-akselin mukaan
ax1.grid(axis='x')

#taustaviivoitus pylväiden taakse
ax1.set_axisbelow(True)
In [5]:
#teen uuden dataframen
df2 = pd.DataFrame({'Myynti 2017': [1321847, 852669, 1032199, 568230],
       'Myynti 2016': [1203434, 923450, 1023563, 542399]},
       index = ['Helsinki', 'Turku', 'Tampere', 'Oulu'])
df2
Out[5]:
Myynti 2017 Myynti 2016
Helsinki 1321847 1203434
Turku 852669 923450
Tampere 1032199 1023563
Oulu 568230 542399
In [6]:
#luokka-akselin nimiöiden asennon säätö (rot=0)
ax2 = df2.plot.bar(rot=0)

#y-akselin otsikko
ax2.set_ylabel('Miljoonaa euroa')

#haen y-akselin ticksit ja muotoilen miljooniksi yhdellä desimaalilla
ax2.set_yticklabels(['{:.1f}'.format(y/1000000) for y in ax2.get_yticks()])

#selitteeseen 2 saraketta (selitteet vierekkäin)
ax2.legend(ncol=2)
Out[6]:
<matplotlib.legend.Legend at 0x24bc1dd0908>
In [7]:
#legend='reverse' kääntää selitteen järjestyksen
#stacked=True pinoaa pylväät päällekkäin
#rot=0 määrittää luokka-akselin nimiöiden asennon
#width=0.7 määrittää pylväiden leveyden (enintään 1)
ax3 = df2.plot.bar(legend='reverse', rot=0, stacked=True, width=0.7)

#otsikoinnit
ax3.set(title='Myynti vuosina 2016 ja 2017', xlabel='Alue', ylabel='Euroa')
Out[7]:
[Text(0, 0.5, 'Euroa'),
 Text(0.5, 0, 'Alue'),
 Text(0.5, 1.0, 'Myynti vuosina 2016 ja 2017')]
In [8]:
#teen uuden dataframen
df3 = pd.DataFrame({'Mies':[17,15,6],'Nainen':[8,15,21]},
                  index = ['Tyytymätön','Ei tyytymätön eikä tyytyväinen','Tyytyväinen'])
df3
Out[8]:
Mies Nainen
Tyytymätön 17 8
Ei tyytymätön eikä tyytyväinen 15 15
Tyytyväinen 6 21
In [9]:
#kaavio ilman tuunausta
df3.plot.bar()
Out[9]:
<matplotlib.axes._subplots.AxesSubplot at 0x24bc2e9d308>
In [10]:
#rot kääntää luokka-akselin nimiöt 45 asteen kulmaan
ax4 = df3.plot.bar(rot=45)

#otsikoita
ax4.set_title('Miesten ja naisten vertailua')
ax4.set_ylabel('Lukumäärä')

#asetan y-akselin ticksit itse
ax4.set_yticks([5, 10, 15, 20])

#y-akselin mukainen taustaviivoitus
ax4.grid(axis='y')
ax4.set_axisbelow(True)

#selite kahteen sarakkeeseen
ax4.legend(ncol=2)

#tallennan kaavion tai tarkkaan ottaen tallenna kuvion (figure), jonka sisällä kaavio on
#kuvioon (figure) pääsen käsiksi plt.gcf() -funktiolla (get current figure)
#ilman lisäparametria bbox_inches='tight' kuvion reunoilta voi jäädä osia tallentumatta
plt.gcf().savefig('testi1.png', bbox_inches='tight')
In [11]:
#tällä selvitän tarjolla olevat kaavion tallennusmuodot
plt.figure().canvas.get_supported_filetypes()
Out[11]:
{'ps': 'Postscript',
 'eps': 'Encapsulated Postscript',
 'pdf': 'Portable Document Format',
 'pgf': 'PGF code for LaTeX',
 'png': 'Portable Network Graphics',
 'raw': 'Raw RGBA bitmap',
 'rgba': 'Raw RGBA bitmap',
 'svg': 'Scalable Vector Graphics',
 'svgz': 'Scalable Vector Graphics',
 'jpg': 'Joint Photographic Experts Group',
 'jpeg': 'Joint Photographic Experts Group',
 'tif': 'Tagged Image File Format',
 'tiff': 'Tagged Image File Format'}
<Figure size 432x288 with 0 Axes>

Usean kaavion kuviot

  • Kaavio on aina figure (kuvio) -olion sisällä.
  • Figure-olion sisään voin sijoittaa useita kaavioita plt.subplots()-funktiolla
  • plt.subplots() palauttaa figure-olion ja kokoelman axes-olioista.
In [12]:
#2x2 kaaviomatriisi
#sharex- ja sharey-lisäparametreilla asetan yhteiset akselit
fig, ax5 = plt.subplots(2, 2, sharex=True, sharey=True)

#figuren otsikko
fig.suptitle('Miesten ja naisten vertailua', fontsize=12, fontweight='bold')

#vasemman yläkulman kaavio
df3['Mies'].plot.barh(ax=ax5[0,0])

#oikean yläkulman kaavio; värinä väripaletin toinen väri (C1)
df3['Nainen'].plot.barh(color='C1', ax=ax5[0,1])

#vasemman alakulman kaavio
df3.plot.barh(legend='reverse',ax=ax5[1,0])

#oikean alakulman kaavio
df3.plot.barh(legend=False, stacked=True, ax=ax5[1,1])

#kaaviot kiinni toisiinsa
fig.subplots_adjust(wspace=0, hspace=0)

#tallennan kuvion
#ilman lisäparametria bbox_inches='tight' kuvion reunoilta voi jäädä osia tallentumatta
fig.savefig('testi2.png', bbox_inches='tight')

Valmiit tyylit

Valmista tyyliä käyttämällä saat nopeasti tuunattua grafiikan ulkoasua.

Tyylin voit ottaa käyttöön plt.style.use('tyylin nimi') -komennolla.

In [13]:
#tarjolla olevien tyylien listaus
plt.style.available
Out[13]:
['bmh',
 'classic',
 'dark_background',
 'fast',
 'fivethirtyeight',
 'ggplot',
 'grayscale',
 'seaborn-bright',
 'seaborn-colorblind',
 'seaborn-dark-palette',
 'seaborn-dark',
 'seaborn-darkgrid',
 'seaborn-deep',
 'seaborn-muted',
 'seaborn-notebook',
 'seaborn-paper',
 'seaborn-pastel',
 'seaborn-poster',
 'seaborn-talk',
 'seaborn-ticks',
 'seaborn-white',
 'seaborn-whitegrid',
 'seaborn',
 'Solarize_Light2',
 'tableau-colorblind10',
 '_classic_test']
In [14]:
#esimerkkinä ggplot-tyyli
plt.style.use('ggplot')

df2.plot.barh()
Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x24bc3138308>