Hisztogram készítése

Az előző fejezetben elsajátított módon töltsük be újra a magyarországi templomokat. Nyomtassuk ki az attribútumok neveit:

fields = layer.pendingFields()    
field_names = [field.name() for field in fields]    
print field_names

Kérdezzük le, hogy a réteg hány mezőt tartalmaz:

print len(field_names)

Irassuk ki a felekezet (‘denominati’) mező indexét:

idx = layer.fieldNameIndex('denominati')    
print idx

Nézzük meg a mezőhöz tartozó egyedi értékeket:

values = layer.uniqueValues(idx)    
print values

Nyomtassuk ki az attribútumhoz tartozó értékeket, ehhez először kérdezzük le az összes objektumot egy Qgis Iterator objektumba:

iter = layer.getFeatures()    
type(iter)

Majd indítsuk be a ciklust:

for feature in iter:    
print feature.attributes()[idx]

Az objektum attribútum értékeinek eléréséhez az attributes() tulajdonságot használjuk. Futtatás után alakítsuk megjegyzéssé a kódnak ezen részét. Számítsuk ki hogy az egyes felekezetekhez hány templom tartozik.

Ehhez hozzunk létre egy asszociatív tömböt (angolul dictionary). Az asszociatív tömb kulcsokat és hozzájuk tartozó értékeket tárol. A kulcs nevére rákérdezve kiiratható a hozzá tartozó érték. Teszteljük le egy mintán:

dict = {'jack': 4098, 'sape': 4139}    
dict['guido'] = 4127    
dict    
dict['jack']

Ürítsük ki a tömböt:

dict = {}

Gyűjtsük a réteg különféle elemeit egy a mintához hasonló tömbbe:

for feature in iter:    
if feature.attributes()[idx] in dict.keys():    
dict[feature.attributes()[idx]] += 1    
else:    
dict[feature.attributes()[idx]] = 1    
print dict

A ‘feature’ változó veszi fel sorra az objektumokat a rétegben, majd egy elágazásban teszteljük, hogy hozzá tartozó ‘denominati’ érték már szerepel-e a kulcsok közt. Ha igen, hozzáadunk egyet a kulcshoz tartozó értékhez. Ha nem szerepel, akkor felvesszük az elem első előfordulását.

Ábrázoljuk az eredményeket egy hisztogramon, ehhez töltsük be a matplotlib és numpy csomagokat:

import numpy as np    
import matplotlib.pyplot as plt

Nézzük meg egyáltalán milyen csomagokat tudunk használni:

help('modules')

A grafikonhoz használjuk a következő sorokat:

fig = plt.figure()    
N = len(dict)    
x = dict.keys()    
y = dict.values()    
ind = np.arange(N) # the x locations for the groups    
width = 0.35 # the width of the bars    
plt.bar(ind, y, width=width)    
plt.xticks(ind + width / 2, x, rotation = 90)    
plt.show()

Adjunk még hozzá két sort az ábrakészítéshez:

plt.ylabel(u'Templomok száma')    
plt.title(u'Templomok megoszlása felekezetek szerint \n Forrás: OpenStreetMap, 2016')

Ezekhez szükség lesz az éketezes karakterekre, ezért adjuk meg a karakterkódolást a script elején:

# -*- coding: utf-8 -*-

1. ábra: Templomok tematikus hisztogramja
1. ábra: Templomok tematikus hisztogramja

Rakjuk sorba a felekezeteket a templomok száma alapján. Ehhez először töltsük be az operator modult:

import operator

Majd adjuk hozzá a következő sorokat a szkripthez:

sorted_dict = sorted(dict.items(), key=operator.itemgetter(1),reverse=True)    
print sorted_dict

Az itemgetter argumentumaként azon oszlop azonosítóját kell megadnunk, ami alapján rendezünk.

Nyomtassuk ki a két legtöbb templommal rendelkező egyházat:

print sorted_dict[0:2]

Mentsük ki a rendezett listát JSON (JavaScript objektum) formátumba:

import json    
json.dump(sorted_dict, open("d:/geodata/sorted.txt",'w'))

További lehetséges feladat:

• Készítsünk egy hasonló ábrát a vallásról (‘religion’)

© Dr. Wirth Ervin