Ugrás a fő tartalomra

Python és a gráf kezelés

Netwokx csomag használata









Networkx osztályú típusú önhurkok megengedettek. Párhuzamos élek megengedettek
Graph nem irányytott Igen Nem
DiGraph irányított Igen Nem
MultiGraph nem irányítot Igen Igen
MultiDiGraph irányított Igen Igen


## Minta 1:
import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()
G = nx.path_graph(4)
print(list(G.nodes))
print(list(G.edges))
#$plt.subplot(126)
nx.draw(G)

print('-------1-------')
G = nx.DiGraph()
G = nx.path_graph(4)
G =G.subgraph([0, 1, 2])
print(list(G.nodes))
print(list(G.edges))
#plt.subplot(121)
nx.draw(G)
#G.clear()

print('-------2-------')
G = nx.MultiGraph()
G = nx.path_graph(4)
print(list(G.nodes))
print(list(G.edges))
#plt.subplot(122)
nx.draw(G)
G.clear()

print('-------3-------')
G = nx.MultiDiGraph()
G = nx.path_graph(4)
print(list(G.nodes))
print(list(G.edges))
#plt.subplot(123)
nx.draw(G)
G.clear()

g = nx.Graph()
g.add_edge('a','b',weight=0.1)
g.add_edge('b','c',weight=1.5)
g.add_edge('a','c',weight=1.0)
g.add_edge('c','d',weight=2.2)
print('----------11--------')
print (nx.shortest_path(g,'b','d'))  ##  [’b’, ’c’, ’d’]
print('---------12---------')
print (nx.shortest_path(g,'b','d', weight='weight')) ## sulytényező figyelembe vétele
nx.draw(g)

G1 = nx.DiGraph()
G1.add_edges_from([("A","B"), ("B","C"), ("C","A"), ("C","D")])
nx.draw(G1, with_labels=True)

info='''
# small famous graphs
petersen=nx.petersen_graph()
tutte=nx.tutte_graph()
maze=nx.sedgewick_maze_graph()
tet=nx.tetrahedral_graph()

# classic graphs
K_5=nx.complete_graph(5)
K_3_5=nx.complete_bipartite_graph(3,5)
barbell=nx.barbell_graph(10,10)
lollipop=nx.lollipop_graph(10,20)

# random graphs
er=nx.erdos_renyi_graph(100,0.15)
ws=nx.watts_strogatz_graph(30,3,0.1)
ba=nx.barabasi_albert_graph(100,5)
red=nx.random_lobster(100,0.9,0.9)

----
import pylab as plt #import Matplotlib plotting interface

g = nx.erdos_renyi_graph(100,0.15)
nx.draw(g)
nx.draw_random(g)
nx.draw_circular(g)
nx.draw_spectral(g)
plt.savefig(‘graph.png’)

---
from IPython.display import SVG
A = nx.nx_agraph.to_agraph(G)
A.draw("out.svg", prog="circo")
SVG("out.svg")

----
G1 = nx.cycle_graph(6)
>>> G2 = nx.wheel_graph(7)
>>> nx.graph_edit_distance(G1, G2)
7.0



### Minta 2

import networkx as nx
G = nx.Graph()        # Ez az osztály nem irányított gráfot valósít meg. Nem veszi figyelembe a két csomópont közötti több élt. Megengedi az önhurokat élek egy csomópont és önmaga között.
G = nx.DiGraph()         # Irányított grafikonok, azaz grafikonok irányított élekkel. Közös műveleteket biztosít a irányított gráfokhoz, (a a grafikon alosztálya).
G = nx.MultiGraph()     # Rugalmas grafikonosztály, amely több irányítatalan élt tesz lehetővé a csomópontok között. A kiegészítő
a rugalmasság a teljesítmény bizonyos mértékű romlásához vezet, bár általában nem jelentős.
G = nx.MultiDiGraph()  # A MultiGraph irányított változata.




### Minta 3

import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()

## csomopontok betöltése
G.add_node(1)  ## csomopont hozzáadása / létrehozása
G.add_node(7)  ## csomopont hozzáadása / létrehozása

G.add_nodes_from([12, 13, 14, 15]) ## csomopontok létrehozása tömbből
G.add_nodes_from(range(100, 110))  ## csompopontok léttrehozása tartományből

H = nx.path_graph(10) ## 10 csomopont otvonal létrehozás (egy vonal)
print('---------0---------')  
for n in H:        ## csomopontok listája
    print(n)

G.add_nodes_from(H)  ##  csomopontok átadása/feltöltése
G.add_node(H)

## élek betöltése
[n for n in G if n < 3] # iterate through nodes
for n in G : ## iterate through nodes
   if n < 3 :
      print('N értéke:',n)
     
for n, nbrsdict in G.adjacency():
    for nbr, eattr in nbrsdict.items():
        if 'weight' in eattr:
            pass

for u, v, weight in G.edges.data('weight'):
    if weight is not None:
        pass
  
G.add_edge(1, 2)             # él létrehozása default edge data=1
G.add_edge(2, 3, weight=0.9) # specify edge data


for n in G:        ## csomopontok listája
    print(n)
   
print('---------1---------')   
for nbr in G[2]:    ## Szomszéd csomopontok listája
    print(nbr)

print('---------2---------')   
print(G.adj)      ## csomopontok listája atributomokkal

G.add_edges_from([(21, 22), (21, 23)])  ## élek betöltése tulip-ből
G.add_edges_from(H.edges)               ## élek objektumok betöltése

#G = nx.cubical_graph()
plt.subplot(121)
nx.draw(G) # default spring_layout


G.add_edge(4, 5, color='blue', weight=0.84, size=300)
print(G[4][5]['size'])         ## -> 300
print(G.edges[4, 5]['color'])  ## -> red

print('Hossz : ', len(G))

plt.subplot(122)
nx.draw(G, pos=nx.circular_layout(G), node_color='b', edge_color='g')  ## formázott megjelenítés


##-- törlés, módosítás
helpem='''
Graph.remove_edge(u, v)                 ## Remove the edge between u and v.
Graph.remove_edges_from(ebunch) ## Remove all edges specified in ebunch.
Graph.update([edges, nodes])           ## Update the graph using nodes/edges/graphs as input.
Graph.clear()                                     ## Remove all nodes and edges from the graph.
Graph.clear_edges()                         ## Remove all edges from the graph.
-----



import networkx as nx
G = nx.Graph()  # Ez az osztály nem irányított gráfot valósít meg. Nem veszi figyelembe a két csomópont közötti több élt. Megengedi az önhurokat élek egy csomópont és önmaga között.
G = nx.DiGraph() # Irányított grafikonok, azaz grafikonok irányított élekkel. Közös műveleteket biztosít a irányított gráfokhoz, (a
a grafikon alosztálya).
G = nx.MultiGraph()  # Rugalmas grafikonosztály, amely több irányítatalan élt tesz lehetővé a csomópontok között. A kiegészítő
a rugalmasság a teljesítmény bizonyos mértékű romlásához vezet, bár általában nem jelentős.
G = nx.MultiDiGraph()  # A MultiGraph irányított változata.


##-------------------------------------

import networkx as nx

## csomopontok generálása

#K = nx.complete_bipartite_graph(3,3)

#K = nx.complete_graph(6)

K = nx.path_graph(6)

 

## másolása

#K33 = K.copy()

 

#pozició beállítása

positions = {0:[-1,1], 1:[0,1], 2:[1,3], 3:[-1,-1], 4:[0,-1], 5:[1,-1]}

 

 

K33.to_undirected()   ## Returns an undirected copy of the graph.

#K33.to_directed()    ## Returns a directed representation of the graph.

#K33.subgraph(nodes)  ##Returns a SubGraph view of the subgraph induced

 

#ax = plt.figure().gca()

#ax.set_axis_off()

options = {'node_size' : 500, 'node_color' : 'r'}

nx.draw_networkx(K33, positions, with_labels=True, **options)

plt.show()

 

 

 

G=nx.DiGraph()

G.add_node(1,pos=(1,1))

G.add_node(2,pos=(2,2))

G.add_edge(1,2)

options = {'node_size' : 300, 'node_color' : 'b'}

pos=nx.get_node_attributes(G,'pos')

 

nodes = nx.draw_networkx_nodes(G, pos, node_size=300, node_color='green', with_labels=True)

edges = nx.draw_networkx_edges(G, pos, node_size=300, arrowstyle='-|>', ## -> -|>

                               arrowsize=100, edge_color='blue',

                               width=2)

nyilhegy = '''

Curve   -           None

CurveB ->         head_length=0.4, head_width=0.2

BracketB          -[          widthB=1.0, lengthB=0.2, angleB=None

CurveFilledB     -|>        head_length=0.4, head_width=0.2

CurveA <-         head_length=0.4, head_width=0.2

CurveAB           <->       head_length=0.4, head_width=0.2

CurveFilledA     <|-        head_length=0.4, head_width=0.2

CurveFilledAB   <|-|>      head_length=0.4, head_width=0.2

BracketA          ]-          widthA=1.0, lengthA=0.2, angleA=None

BracketAB        ]-[         widthA=1.0, lengthA=0.2, angleA=None, widthB=1.0, lengthB=0.2, angleB=None

Fancy   fancy    head_length=0.4, head_width=0.4, tail_width=0.4

Simple  simple  head_length=0.5, head_width=0.5, tail_width=0.2

Wedge wedge  tail_width=0.3, shrink_factor=0.5

BarAB  |-|         widthA=1.0, angleA=None, widthB=1.0, angleB=None

'''

 

# nx.draw(G,pos, with_labels=True)

nx.draw(G,pos, with_labels=True, **options)

 

plt.show()





Egy kis összefoglaló: 



Minták:







Megjegyzések