veŽbe: vizuelizacija grafova u python-u pomoĆu … · 2020. 5. 13. · 7 3 crtanje grafa pomoću...
TRANSCRIPT
Predmet: Sistemi veštačke inteligencije
VEŽBE: VIZUELIZACIJA GRAFOVA U PYTHON-U
POMOĆU MATPLOTLIB-A
SADRŽAJ
1 Matpotlib ............................................................................................................................ 2
2 Crtanje jednostavnih krivih u Matplotlib - u...................................................................... 4
3 Crtanje grafa pomoću Matplotlib-a .................................................................................... 7
3.1 Osnovno crtanje grafa pomoću Matplotlib-a .............................................................. 7
3.2 Različiti prikazi grafova pomoću Matplotlib-a ........................................................... 9
3.2.1 Crtanje grafa pomoću prikaza spring_layout ..................................................... 10
3.2.2 Crtanje grafa pomoću prikaza random_layout ................................................... 11
3.2.3 Crtanje grafa pomoću prikaza circular_layout ................................................... 13
3.2.4 Crtanje grafa pomoću prikaza shell_layout ....................................................... 14
4 Crtanje mreža i grafova pomoću matplotlib-a ................................................................. 16
4.1 Naredba draw ............................................................................................................ 16
4.2 Naredba draw_networkx ........................................................................................... 17
4.3 Naredba draw_networkx_nodes ................................................................................ 19
4.4 Naredba draw_networkx_edges ................................................................................ 19
4.5 Naredba draw_networkx_labels ................................................................................ 20
4.6 Naredba draw_networkx_edge_labels ...................................................................... 21
5 Mogućnosti Matplotlib-a za prikaz slika, histograma, putanja… .................................... 22
6 Literatura .......................................................................................................................... 23
2
1 Matpotlib
Python je interpretirani, interaktivni, objektno orijentisani programski jezik visokog nivoa,
koji poseduje dinamičku semantiku. Python podržava pakete koji podstiču modularnost
programa i ponovno korišćenje koda. NetworkX je Python paket za kreiranje, manipulaciju i
proučavanje strukture, dinamike i funkcija složenih mreža.
Matplotlib je Python paket za crtanje za Python programskog jezika i njegovog numeričkog
matematičkog proširenja NumPy. On pruža objektno orijentisani API za ugrađivanje parcela
u aplikacije koje koriste GUI alatke opšte namene kao što su Tkinter, vkPithon, Kt ili GTK +.
Slika 1. Matplotlib logo
NumPy je osnovni paket za naučno računarstvo sa Python-om. Sadrži između ostalog:
moćan n-dimenzionalni niz
sofisticirane (emitovane) funkcije
alati za integraciju C / C ++ i Fortran koda
korisnu linearnu algebru, Fourier-ova transformacija i mogućnosti slučajnog broja
Pored očiglednih naučnih primena, NumPy se može koristiti i kao efikasan višedimenzionalni
prikaz generičkih podataka. Mogu se definisati proizvoljni tipovi podataka. Ovo omogućava
NumPy-ju da se bez problema integriše sa širokoim spektrom baza podataka. NumPy je
licenciran pod BSD licencom, omogućavajući ponovnu upotrebu sa nekoliko ograničenja.
Slika 2. NumPy logo
3
Primer korišćenja Matplotlib-a:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 5, 0.1)
y = np.sin(x)
plt.plot(x, y)
Slika 3. Primer korišćenja Matplotlib-a
4
2 Crtanje jednostavnih krivih u Matplotlib - u
Pristup Python laboratoriji omogućava matplotlib lakim za učenje za iskusne korisnike
MATLAB-a, što ga čini održivanom alternativom MATLAB-a kao nastavno sredstvo za
numeričke materike i obradu signala.
Neke od prednosti kombinacija Python, NumPy i Matplotlib u odnosu na MATLAB:
Potpuno opremljeni modernim objektivno-orijentisanim programskim jezikom
pogodnim za razvoj softvera velikih veličina
Besplatan, otvorenog koda, serveri bez licence
SVG podrška
Primer 1.
import matplotlib.pyplot as plt
import numpy as np
a = np.linspace(0,10,100)
b = np.exp(-a)
plt.plot(a,b)
plt.show()
Slika 4. Primer broj 1 za crtanje jednostavnih krivih
5
Primer 2.
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.title('About as simple as it gets, folks')
plt.grid(True)
plt.savefig("test.png")
plt.show()
Slika 5. Primer broj 2 za crtanje jednostavnih krivih
6
Primer 3.
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C,S = np.cos(X), np.sin(X)
plt.plot(X,C)
plt.plot(X,S)
plt.show()
Slika 6. Primer broj 3 za crtanje jednostavnih krivih
7
3 Crtanje grafa pomoću Matplotlib-a
Glavna Python biblioteka za crtanje grafova je matplotlib.
3.1 Osnovno crtanje grafa pomoću Matplotlib-a
Primer 1.
import matplotlib.pyplot as plt
import networkx as nx
G = nx.path_graph(8)
nx.draw(G)
plt.show()
Slika 7. Primer broj 1 za crtanje grafa
Primer 2.
import networkx as nx
import matplotlib.pyplot as plt
G=nx.path_graph(4)
print("Nodes of graph: ")
print(G.nodes())
print("Edges of graph: ")
print(G.edges())
nx.draw(G)
8
plt.savefig("path_graph1.png")
plt.show()
Slika 8. Primer broj 2 za crtanje grafa
Primer 3.
import matplotlib.pyplot as plt
import networkx as nx
G = nx.path_graph(30)
nx.draw(G)
plt.show()
9
Slika 9. Primer broj 3 za crtanje grafa
3.2 Različiti prikazi grafova pomoću Matplotlib-a
Postoje različite vrste Layout-a:
Bipartite layout
Circular layout
Kamada Kawai layout
Random layout
Rescale layout
Shell layout
Spring layout
Spectral layout
10
3.2.1 Crtanje grafa pomoću prikaza spring_layout
Koristimo
spring_layout(G, dim=2, k=None, pos=None, fixed=None, iterations=50,
weight='weight', scale=1.0)
za pozicioniranje čvorova pomoću Fruchterman-Reingold force-directed algoritma.
Parameters
:
G : NetworkX graph
dim : int
Dimension of layout
k : float (default=None)
Optimal distance between nodes. If None the distance is set to 1/sqrt(n)
where n is the number of nodes. Increase this value to move nodes farther
apart.
pos : dict or None optional (default=None)
Initial positions for nodes as a dictionary with node as keys and values as a
list or tuple. If None, then nuse random initial positions.
fixed : list or None optional (default=None)
Nodes to keep fixed at initial position.
iterations : int optional (default=50)
Number of iterations of spring-force relaxation
weight : string or None optional (default=’weight’)
The edge attribute that holds the numerical value used for the edge weight.
If None, then all edge weights are 1.
scale : float (default=1.0)
Scale factor for positions. The nodes are positioned in a box of size
[0,scale] x [0,scale].
Returns : dict :
A dictionary of positions keyed by node
import matplotlib.pyplot as plt
import networkx as nx
G = nx.cycle_graph(24)
pos = nx.spring_layout(G, iterations=200)
nx.draw(G, pos, node_color=range(24), node_size=800, cmap=plt.cm.Blues)
plt.show()
11
Slika 10. Crtanje grafa pomoću spring_layout
3.2.2 Crtanje grafa pomoću prikaza random_layout
Koristimo
random_layout(G, center=None, dim=2, seed=None)
Parameters:
G (NetworkX graph or list of nodes) – A position will be assigned
to every node in G.
center (array-like or None) – Coordinate pair around which to
center the layout.
dim (int) – Dimension of layout.
seed (int, RandomState instance or None optional (default=None))
– Set the random state for deterministic node layouts. If
int, seed is the seed used by the random number generator, if
numpy.random.RandomState instance, seed is the random
number generator, if None, the random number generator is the
RandomState instance used by numpy.random.
Returns: pos – A dictionary of positions keyed by node
Return type: dict
12
import matplotlib.pyplot as plt
import networkx as nx
G = nx.path_graph(4)
pos=nx.random_layout(G)
shells = [[0], [1,2,3]]
pos = nx.shell_layout(G, shells)
import matplotlib.pyplot as plt
import networkx as nx
G = nx.path_graph(24)
pos = nx.random_layout(G)
nx.draw(G, pos, node_color=range(24), node_size=800, cmap=plt.cm.Blues)
plt.show()
Slika 11. Crtanje grafa pomoću random_layout
13
3.2.3 Crtanje grafa pomoću prikaza circular_layout
Koristimo
circular_layout(G, scale=1, center=None, dim=2)
import matplotlib.pyplot as plt
import networkx as nx
G = nx.path_graph(4)
pos=nx.circular_layout(G)
shells = [[0], [1,2,3]]
pos = nx.shell_layout(G, shells)
import matplotlib.pyplot as plt
import networkx as nx
G = nx.path_graph(24)
pos = nx.circular_layout(G)
nx.draw(G, pos, node_color=range(24), node_size=600, cmap=plt.cm.Reds)
plt.show()
Parameters:
G (NetworkX graph or list of nodes) – A position will
be assigned to every node in G.
scale (number (default: 1)) – Scale factor for positions.
center (array-like or None) – Coordinate pair around
which to center the layout.
dim (int) – Dimension of layout. If dim>2, the
remaining dimensions are set to zero in the returned
positions. If dim<2, a ValueError is raised.
Returns: pos – A dictionary of positions keyed by node
Return type: Dict
14
3.2.4 Crtanje grafa pomoću prikaza shell_layout
Koristimo
shell_layout(G, nlist=None, scale=1, center=None, dim=2)
Parameters:
G (NetworkX graph or list of nodes) – A position will be
assigned to every node in G.
nlist (list of lists) – List of node lists for each shell.
scale (number (default: 1)) – Scale factor for positions.
center (array-like or None) – Coordinate pair around which
to center the layout.
dim (int) – Dimension of layout, currently only dim=2 is
supported. Other dimension values result in a ValueError.
Returns: pos – A dictionary of positions keyed by node
Return type: dict
Slika 12. Crtanje grafa pomoću circular_layout
15
import matplotlib.pyplot as plt
import networkx as nx
G = nx.path_graph(4)
pos=nx.shell_layout(G)
shells = [[0], [1,2,3]]
pos = nx.shell_layout(G, shells)
import matplotlib.pyplot as plt
import networkx as nx
G = nx.path_graph(24)
pos = nx.shell_layout(G)
nx.draw(G, pos, node_color=range(24), node_size=1200, cmap=plt.cm.Greens)
plt.show()
Slika 13. Crtanje grafa pomoću shell_layout
16
4 Crtanje mreža i grafova pomoću matplotlib-a
NetworkX pruža osnovnu funkcionalnost za vizualizaciju grafova, ali je njegov glavni cilj da
omogući analizu grafova, a ne vizualizaciju grafova. U budućnosti, funkcionalnost
vizuelizacije grafa može biti uklonjena iz NetworkX-a ili dostupna samo kao dodatni paket.
Značajni primeri posvećenih i potpuno opremljenih alata za vizuelizaciju grafova su
Citoscape, Gephi, Graphviz i, za LaTeX slaganje sloga, PGF / TikZ. Da biste koristili ove i
druge takve alate, trebali biste izvesti svoj NetworkX grafik u format koji se može pročitati
pomoću tih alata.
4.1 Naredba draw
Naredbom draw se iscrtava trenutna figura.
draw(G, pos=None, ax=None, **kwds)
Parametri:
G (graph) – NetworkX graf
Pos (rečnik) - Rečnik sa čvorovima kao ključevima i pozicijama kao vrednostima.
Ovo će se detaljno objasniti u sledećem materijalu za vežbe.
Ax(Matplotlib osni objekat) – Iscrtava graf po specifičnim Matplotlib osama
Kwds (Opcione ključne reči) – Koriste se za rad sa labelama
17
4.2 Naredba draw_networkx
Slika 14. Draw_networkX
18
Primer 2.
G=nx.dodecahedral_graph()
nx.draw(G)
nx.draw(G,pos=nx.spring_layout(G)) # use spring layout
>>> import matplotlib.pyplot as plt
>>> import networkx as nx
>>> G=nx.dodecahedral_graph()
>>> nx.draw(G) # networkx draw()
>>> plt.draw() # pyplot draw()
Slika 15. Primer 2 draw_netorkX
19
4.3 Naredba draw_networkx_nodes
import matplotlib.pyplot as plt
from networkx import nx
G=nx.dodecahedral_graph()
nodes=nx.draw_networkx_nodes(G,pos=nx.spring_layout(G))
Slika 16. Draw_networkx_nodes
4.4 Naredba draw_networkx_edges
import matplotlib.pyplot as plt
from networkx import nx
G=nx.dodecahedral_graph()
edges=nx.draw_networkx_edges(G, pos=nx.spring_layout(G))
20
Slika 17. Draw_netwotkx_edges
4.5 Naredba draw_networkx_labels
import matplotlib.pyplot as plt
import networkx as nx
G=nx.dodecahedral_graph()
labels=nx.draw_networkx_labels(G,pos=nx.spring_layout(G))
Slika 18. Draw_networkx_labels
21
4.6 Naredba draw_networkx_edge_labels
import matplotlib.pyplot as plt
import networkx as nx
G=nx.dodecahedral_graph()
edge_labels=nx.draw_networkx_edge_labels(G,pos=nx.spring_layout(G))
Slika 19. Draw_networkx_edge_labels
22
5 Mogućnosti Matplotlib-a za prikaz slika, histograma, putanja…
Reference koje se koriste za kodiranje histograma
import matplotlib matplotlib.pyplot.hist matplotlib.pyplot.xlabel matplotlib.pyplot.ylabel matplotlib.pyplot.text matplotlib.pyplot.grid matplotlib.pyplot.show
Primer histograma za samostalan rad studenata
Reference koje se koriste za kodiranje histograma u 2D
import matplotlib matplotlib.colors matplotlib.colors.PowerNorm matplotlib.axes.Axes.hist2d matplotlib.pyplot.hist2d
23
Reference koje se koriste za kodiranje slika
import matplotlib matplotlib.path matplotlib.path.Path matplotlib.patches matplotlib.patches.PathPatch matplotlib.patches.Circle matplotlib.axes.Axes.add_patch matplotlib.transforms matplotlib.transforms.Affine2D matplotlib.transforms.Affine2D.rotate_deg
Postoji još mnogo mogućnosti kao što su:
Three-dimensional plotting
Streamplot
Ellipses
Bar charts
Pie charts
Scatter plots
GUI widgets
Date handling
Log plots
Polar plots
Legends
6 Literatura
[1] https://www.python.org/
[2] https://networkx.github.io/documentation/stable/tutorial.html
[3] https://www.spyder-ide.org/
[4] https://realpython.com/
[5] https://matplotlib.org/2.0.2/index.html
[6] http://www.numpy.org/