Adatfájlok, hisztogramok, logaritmikus ábrák


Ebben a Notebookban bemutatjuk a hogyan kell adatfájlokat beolvasni/kimenteni, hisztogramokat készíteni, logaritmikus tengelyeket beállítani.

In [1]:
%pylab inline 
figsize(6,6) #Képméret megváltoztatása
Populating the interactive namespace from numpy and matplotlib

Adatfájlok kezelése a numpy csomaggal

A numpy csomag segítségével lehetőség van adatfájlok beolvasására változókba, illetve változók adatait kimenteni fájlokba.

Adatok beolvasása fájlból

Adatok beolvasását a numpy loadtxt parancsa teszi lehetővé. Számos kapcsolója van, melyekkel megadható, hogy mi az oszlopelválasztó karakter, melyik oszlopot akarjuk beolvasni stb.

In [2]:
figsize(7,7)
data=loadtxt("sinusadatok.dat")
print(type(data))
print(ndim(data))
print(data)
<class 'numpy.ndarray'>
2
[[  0.          0.          2.0312   ]
 [  0.0159236   0.0159229   2.08116  ]
 [  0.0318471   0.0318418   2.43211  ]
 ..., 
 [ 15.8758     -0.167046    2.68881  ]
 [ 15.8917     -0.182724    2.86203  ]
 [ 15.9076     -0.198356    3.0767   ]]
In [3]:
plot(data)
Out[3]:
[<matplotlib.lines.Line2D at 0x7f46e8a127b8>,
 <matplotlib.lines.Line2D at 0x7f46e8a12978>,
 <matplotlib.lines.Line2D at 0x7f46e8a12b38>]
In [4]:
x=data[:,0]
print(x[0:10])
[ 0.         0.0159236  0.0318471  0.0477707  0.0636943  0.0796178
  0.0955414  0.111465   0.127389   0.143312 ]
In [5]:
y=data[:,1]
z=data[:,2]
plot(x,y, label="sinus")
plot(x,z, label="1,5*cosinus+3")
legend(loc='best') # Ábrafelirat elhelyezése
Out[5]:
<matplotlib.legend.Legend at 0x7f46e909fbe0>

Adatok mentése fájlba

Adatokat (listákat, tömböket) a savetxt paranccsal lehet.

In [6]:
x = arange(0.0,5.0,1.0)        # hozzuk létre x,y és z listát
y = arange(0.0,5.0,1.0)
z = arange(0.0,5.0,1.0)
savetxt('adat.csv', x, delimiter=',')  # Mentsük le x-t mint egy vektort
savetxt('adat1.csv', (x,y,z))          # Mentsük el 2Dimenziós vektorként 
                                       #az x,y,z-t (egymás alá írva őket)
savetxt('adat2.csv', x, fmt='%1.4e')   # Formatban megadható a kiírt adatok formátuma
                                       # használhatunk exponenciális alakot a fájlban
In [7]:
xx=loadtxt("adat.csv",  delimiter=',')
plot(xx)
Out[7]:
[<matplotlib.lines.Line2D at 0x7f46e7b80748>]
In [8]:
yy=loadtxt("adat1.csv",)
print(yy)
plot(yy)
[[ 0.  1.  2.  3.  4.]
 [ 0.  1.  2.  3.  4.]
 [ 0.  1.  2.  3.  4.]]
Out[8]:
[<matplotlib.lines.Line2D at 0x7f46e8e89080>,
 <matplotlib.lines.Line2D at 0x7f46e8e89320>,
 <matplotlib.lines.Line2D at 0x7f46e8e89518>,
 <matplotlib.lines.Line2D at 0x7f46e8e89710>,
 <matplotlib.lines.Line2D at 0x7f46e8e89908>]
In [9]:
zz=loadtxt("adat2.csv")
print(zz)
[ 0.  1.  2.  3.  4.]

Hisztogramok készítése

Ehhez használni kell hist függvényt matplotlib.pyplot csomagból. 3 objektuma van a hist függvénynek:

  • n: binekben levő darabszám vagy valószínűség
  • bins: binek
  • patches: a létrehozott téglalapok információi
In [10]:
# Legyen egy adatsorunk normál eloszlású
mu, sigma = 2, 0.5                #  átlaga 2, szórásnégyzete 0.5
v = random.normal(mu,sigma,10000) # Készítsünk egy 10000 elemű véletlen számsort
print(v)
[ 2.6406123   1.93939878  1.90860069 ...,  2.14456813  2.06820837
  1.78282325]
In [11]:
hist(v, bins=50)       # Készítsünk 50 binből álló hisztogramot (matplotlib-el)
# show()
Out[11]:
(array([   1.,    1.,    2.,    1.,    6.,    5.,   19.,   31.,   27.,
          45.,   63.,   70.,   88.,  133.,  160.,  231.,  256.,  321.,
         348.,  442.,  515.,  536.,  544.,  546.,  555.,  581.,  607.,
         529.,  553.,  480.,  414.,  371.,  337.,  263.,  221.,  181.,
         125.,  124.,   86.,   71.,   36.,   19.,   20.,   13.,    9.,
           3.,    5.,    4.,    0.,    2.]),
 array([ 0.12861061,  0.2034235 ,  0.2782364 ,  0.35304929,  0.42786219,
         0.50267508,  0.57748798,  0.65230087,  0.72711377,  0.80192666,
         0.87673956,  0.95155246,  1.02636535,  1.10117825,  1.17599114,
         1.25080404,  1.32561693,  1.40042983,  1.47524272,  1.55005562,
         1.62486851,  1.69968141,  1.7744943 ,  1.8493072 ,  1.9241201 ,
         1.99893299,  2.07374589,  2.14855878,  2.22337168,  2.29818457,
         2.37299747,  2.44781036,  2.52262326,  2.59743615,  2.67224905,
         2.74706195,  2.82187484,  2.89668774,  2.97150063,  3.04631353,
         3.12112642,  3.19593932,  3.27075221,  3.34556511,  3.420378  ,
         3.4951909 ,  3.5700038 ,  3.64481669,  3.71962959,  3.79444248,
         3.86925538]),
 <a list of 50 Patch objects>)
In [12]:
mu, sigma = 100, 15
x = mu + sigma * random.randn(10000)

n, bins, patches = hist(x, 50, normed=1, facecolor='g', alpha=0.75) 

xlabel('Smarts')
ylabel('Probability')
title('Histogram of IQ')
text(60, .025, r'$\mu=100,\ \sigma=15$', fontsize=15) # Szöveg elhelyezése az ábrában (x,y helyen)
axis([40, 160, 0, 0.03])
grid(True)         # rács megjelenítése
# show()

Hisztogram ábrázolása, az eloszlásfüggvénnyel közösen

In [13]:
mu, sigma = 100, 15
x = mu + sigma*random.randn(10000)

# oszlopdiagram készítése
n, bins, patches = hist(x, 50, normed=1, facecolor='green', alpha=0.75)

# adjuk hozzá a numerikus görbét
y = normpdf( bins, mu, sigma)
l = plot(bins, y, 'r--', linewidth=3)

xlabel('Smarts')
ylabel('Probability')
title(r'$\mathrm{Histogram\ of\ IQ:}\ \mu=100,\ \sigma=15$')
axis([40, 160, 0, 0.03])
grid(True)

# show()

Logaritmikus tengelyek beállítása

In [14]:
figsize(15,10)

# 0 és 1 közötti számok generálása, majd sorba rendezzük a "sort" paranccsal
y = random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()

x = arange(len(y)) # x legyen az y lista hosszával megegyező másik lista


# lineáris tengelyek (default)
subplot(221)
plot(x, y)
yscale('linear')
title('linear')
grid(True)


# log x tengely
subplot(222)
plot(x, y)
xscale('log')
title('x-log')
grid(True)


# log y tengely
subplot(223)
plot(x, y)
yscale('log')
title('y-log')
grid(True)

# loglog
subplot(224)
plot(x, y)
xscale('log')
yscale('log')
title('log-log')
grid(True)