Matematikai Algoritmusok és Felfedezések I.

9. Előadás: Matplotlib

2021 április 12.

Adatvizualizáció

Fontos, hogy az adatokat informatív módon tudjuk prezentálni mások (és persze magunk) számára.

Drawing

mis

mis

mis

mis

mis

In [59]:
import numpy as np
import random as rn
import matplotlib.pyplot as plt
import csv                            # csv fájlból fogunk beolvasni adatokat. 

Matplotlib

  • A legismertebb grafikon és ábra készítő Pythonban.
  • Példákon keresztül nézzük meg a működését.

New Yorki mókusok

Az adatok egy csv (comma separated values) fájlban vannak, a honlapon megtalálható. Minden sor egy mókus észlelés adatait írja le a Central Parkban. Az első sorból látszik, hogy milyen adatok vannak megadva észlelésenként:

long,lat,unique_squirrel_id,hectare,shift,date,hectare_squirrel_number,age,primary_fur_color,highlight_fur_color, combination_of_primary_and_highlight_color,color_notes,location,above_ground_sighter_measurement,specific_location,running, chasing,climbing,eating,foraging,other_activities,kuks,quaas,moans,tail_flags,tail_twitches,approaches,indifferent,runs_from, other_interactions,lat_long,zip_codes,community_districts,borough_boundaries,city_council_districts,police_precincts

Először készítünk egy függvényt, ami beolvas egy oszlopot:

In [4]:
def getcolumn(fajlnev, ind):      # egy oszlop beolvasása egy cvs fájlból, de legfeljebb 3000 elem. 
    ans=[]
    c=0
    with open(fajlnev, newline='') as csvfile:
        sqreader = csv.reader(csvfile, delimiter=',', quotechar='"')
        ans=[next(sqreader)[ind] for _ in range(3000)]
        del ans[0]
        return ans
    return ans 
In [5]:
getcolumn('nyc_squirrels.csv',7)[0:10] # első 10 mókus kora
Out[5]:
['NA',
 'Adult',
 'Adult',
 'Juvenile',
 'NA',
 'Juvenile',
 'Adult',
 'NA',
 'Adult',
 'Adult']
In [7]:
a=getcolumn('nyc_squirrels.csv',7)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)           # A tömbben előforduló egyedei objektumok és hogy hányszor 
                                                              # fordulnak elő
In [8]:
print(unique)
print(counts)
['?' 'Adult' 'Juvenile' 'NA']
[   4 2550  327  118]
In [9]:
a=getcolumn('nyc_squirrels.csv',7)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)

fig, axs = plt.subplots(1, 1, figsize=(5, 5))   # méret és grafikonok száma
axs.bar(unique,counts)
plt.show()

Drawing

Több grafikon egymás mellett

A matplotlibet kétféle stílusban lehet használni. Mi az objektum orientált stílust fogjuk követni, ez az ajánlott.

Egy képen belül több grafikon van, amit axes-nek hívunk. (Nem összekeverendő az axis szóval, ami tengelyt jelent!) Amelyikre kiadjuk a parancsot, arra rajzolunk.

(A másik stílus az volna, hogy mindig plt.parancs formában adjuk ki a rajzoló parancsokat és egy külön parancsal állítjuk be, hogy éppen melyik grafikonra rajzolunk)

In [10]:
fig, axs = plt.subplots(2, 2, figsize=(10, 10))

a=getcolumn('nyc_squirrels.csv',7)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)
axs[0, 0].bar(unique,counts)

a=getcolumn('nyc_squirrels.csv',8)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)
axs[0, 1].bar(unique,counts)

a=getcolumn('nyc_squirrels.csv',12)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)
axs[1, 0].bar(unique,counts)

a=getcolumn('nyc_squirrels.csv',4)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)
axs[1, 1].bar(unique,counts)


plt.show()
In [13]:
a=getcolumn('nyc_squirrels.csv',5)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)

fig, axs = plt.subplots(1, 1, figsize=(8, 8))
axs.bar(unique,counts)
plt.show()
In [15]:
a=getcolumn('nyc_squirrels.csv',5)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)

fig, axs = plt.subplots(1, 1, figsize=(8, 8))
axs.bar(unique,counts)
labels = axs.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
plt.show()
In [19]:
a=getcolumn('nyc_squirrels.csv',5)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)
fig, axs = plt.subplots(1, 1, figsize=(8, 8))
axs.bar(unique,counts)
labels = axs.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
axs.set(ylim=[50, 500], ylabel='Találkozások száma', xlabel='Dátum',title='Mókusok a Central Parkban')
plt.show()
In [21]:
a=getcolumn('nyc_squirrels.csv',5)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)
unique=[l[4:8]+". "+l[0:2]+". "+l[2:4]+"." for l in unique]
fig, axs = plt.subplots(1, 1, figsize=(8, 8))
axs.bar(unique,counts)
labels = axs.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
axs.set(ylim=[50, 500], ylabel='Találkozások száma', xlabel='Dátum',
       title='Mókusok a Central Parkban')
plt.show()
In [22]:
a=getcolumn('nyc_squirrels.csv',5)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)
unique=[l[4:8]+". "+l[0:2]+". "+l[2:4]+"." for l in unique]

fig, axs = plt.subplots(1, 1, figsize=(10, 10))
axs.bar(unique,counts,label="Nagy kék oszlopok")
labels = axs.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
axs.set(ylim=[50, 500], ylabel='Találkozások száma', xlabel='Dátum',
       title='Mókusok a Central Parkban')

for group in [1,6,5]:
    axs.text( group, counts[group], "Túl sok mókus", fontsize=15,
            verticalalignment="top", rotation=90,color="white")
axs.legend()
plt.show()

Kördiagram

In [25]:
a=getcolumn('nyc_squirrels.csv',8)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)

fig, axs = plt.subplots(1, 1, figsize=(8, 8))
axs.pie(counts,labels=unique)
axs.set(title='Mókusok színei a Central Parkban')
plt.show()
In [26]:
fig,ax = plt.subplots(1,1,figsize = (10,10))
ax.axis('equal')
langs = ['Ég', 'Piramis napos oldala', 'Piramis árnyékos oldala']
nums = [285/360,60/360,15/360]
colors=["lightskyblue","yellow","gold"]
ax.pie(nums, labels = langs, colors=colors,startangle=-50)
plt.show()
In [28]:
labels = ['Frogs', 'Hogs', 'Dogs', 'Logs']
sizes = [15, 30, 45, 10]
explode = (0.1, 0.1, 0.1, 0.5)  # melyik mennyire jöjjön ki

fig1, ax1 = plt.subplots(figsize=(10,10))
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.2f%%',
        shadow=True, startangle=90)
plt.show()

Függvény

In [29]:
a=getcolumn('nyc_squirrels.csv',5)
num=np.array(a)
unique, counts = np.unique(num, return_counts=True)
unique=[l[4:8]+". "+l[0:2]+". "+l[2:4]+"." for l in unique]

fig, axs = plt.subplots(1, 1, figsize=(10, 10))
axs.bar(unique,counts)
labels = axs.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
axs.set(ylim=[50, 500], ylabel='Találkozások száma', xlabel='Dátum',
       title='Mókusok a Central Parkban')

for group in [1,6,5]:
    axs.text( group, counts[group], "Túl sok mókus", fontsize=15,
            verticalalignment="top", rotation=90,color="white")
axs.plot(counts,color="red")
plt.show()
In [30]:
fig, axs = plt.subplots(1, 1, figsize=(5, 5))

plt.plot([10,20,15,30], [40,50,10,30], lw=2)
plt.plot([20,15,30,10], [40,50,10,30], lw=2)

plt.show()
In [32]:
fig, axs = plt.subplots(1, 1, figsize=(10, 10))

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
plt.plot(t, s, lw=3)
plt.ylim(-2, 2)
plt.show()
In [34]:
fig, axs = plt.subplots(1, 1, figsize=(10, 10))

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
 
axs.annotate('lokális maximum', xy=(2, 1), xytext=(3, 1.5),
             arrowprops=dict(facecolor='black', shrink=0.05), size=40
             )
plt.ylim(-2, 2)
plt.show()
In [35]:
def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)

t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)

fig, axs = plt.subplots(2, 1, figsize=(10, 10))
axs[0].plot(t1, f(t1), 'ko')
axs[0].plot( t2, f(t2), 'k')
axs[1].plot(t2, np.cos(2*np.pi*t2), 'r-')
plt.show()

Scatter plot

Pontokat rajzol, x-koordináta és y-koordináta tömb alapján.

In [36]:
xpos=getcolumn('nyc_squirrels.csv',0)
ypos=getcolumn('nyc_squirrels.csv',1)
xpos=np.array([float(a) for a in xpos])
ypos=np.array([float(a) for a in ypos])

fig, axs = plt.subplots(1, 1, figsize=(10, 10))
axs.scatter(xpos,ypos)
plt.show()
In [38]:
xpos=getcolumn('nyc_squirrels.csv',0)
ypos=getcolumn('nyc_squirrels.csv',1)
xpos=np.array([float(a) for a in xpos])
ypos=np.array([float(a) for a in ypos])

fig, axs = plt.subplots(1, 1, figsize=(10, 10)) 
axs.scatter(xpos,ypos,s=5)
plt.show()
In [39]:
xpos=getcolumn('nyc_squirrels.csv',0)
ypos=getcolumn('nyc_squirrels.csv',1)
xpos=np.array([float(a) for a in xpos])
ypos=np.array([float(a) for a in ypos])

col=getcolumn('nyc_squirrels.csv',8)
def colorpicker(c):
    if c=='Gray': return "gray"
    if c=='Cinnamon': return "gold"
    if c=='Black': return "black"
    return 'blue'
    
colors=[colorpicker(a) for a in col]

fig, axs = plt.subplots(1, 1, figsize=(10, 10))
axs.scatter(xpos,ypos,s=5,c=colors)
plt.show()
In [40]:
xpos=getcolumn('nyc_squirrels.csv',0)
ypos=getcolumn('nyc_squirrels.csv',1)
xpos=np.array([float(a) for a in xpos])
ypos=np.array([float(a) for a in ypos])

col=getcolumn('nyc_squirrels.csv',12)
def colorpicker(c):
    if c=='Above Ground': return "blue"
    return 'red'
    
colors=[colorpicker(a) for a in col]

fig, axs = plt.subplots(1, 1, figsize=(10, 10))
axs.scatter(xpos,ypos,s=5,c=colors)
plt.show()