Les scripts suivants permettent de choisir entre plusieurs types de configuration pour tracer un graphe avec Networkx, module Python.
On pourra choisir de personaliser :
la couleur d’un noeud
l’etiquette des noeuds
l’étiquette des arêtes
le type de trait (plein ou en pointillés) des arêtes
Déclaration du graphe
importmatplotlib.pyplotaspltimportnetworkxasnxfromnumpyimportarrayG=nx.Graph()# definition des noeudsG.add_node(0,label='A',col='pink')G.add_node(1,label='B',col='red')G.add_node(2,label='C',col='white')G.add_node(3,label='D',col='white')G.add_node(4,label='E',col='white')G.add_node(5,label='F',col='blue')# definition des aretesG.add_edge(0,1,weight=6,styl='dashed')G.add_edge(0,2,weight=5,styl='solid')G.add_edge(0,4,weight=1,styl='solid')G.add_edge(4,1,weight=5,styl='solid')G.add_edge(4,2,weight=1,styl='solid')G.add_edge(4,3,weight=3,styl='solid')G.add_edge(2,3,weight=8,styl='solid')G.add_edge(4,5,weight=6,styl='dashed')G.add_edge(3,5,weight=9,styl='solid')
# positions for all nodespos=nx.spring_layout(G)# nodesnx.draw_networkx_nodes(G,pos,node_size=700,node_color=colorList,alpha=0.9)# labelsnx.draw_networkx_labels(G,pos,labels=labels_nodes, \
with_labels=True,font_size=20, \
font_color='black', \
font_family='sans-serif')# edgesnx.draw_networkx_edges(G,pos,width=1)nx.draw_networkx_edge_labels(G,pos,width=1,edge_labels=labels_edges,style='dashed',font_color='red')plt.axis('off')plt.savefig('datas/fig1.png')plt.show()
Utilisation d’une fonction multitracés
fonction multigraphes
defmultigraphe(G,pos,name,edg=True,dashed=False):"""
tracé d'un graphe G à partir des options obligatoires :
label et col pour G.nodes :
G.add_node(0,label='A',col='pink')
weight et styl pour G.edges :
G.add_edge(0,1,weight=6,styl='dashed')
Params :
--------
G : graphe
pos : un dictionnaire qui contient les positions des différents noeuds
obtenu à partir de : pos = nx.spring_layout(G)
name : chaine de caractères finissant par l'extension .png par ex monfichier.png
edg : option pour affichage des etiquettes sur les aretes
par defaut edg vaut 'True' et l'etiquette EST affichée ('False' sinon)
dashed : option pour tracer un graphe en solid + en pointillé avec l'option styl de G.edges
"""# liste de couleurs pour les noeudsliste=list(G.nodes(data='col'))colorNodes={}fornoeudinliste:colorNodes[noeud[0]]=noeud[1]colorList=[colorNodes[node]fornodeincolorNodes]# Dict d'etiquette des noeudsliste=list(G.nodes(data='label'))labels_nodes={}fornoeudinliste:labels_nodes[noeud[0]]=noeud[1]# Dict d'etiquette des areteslabels_edges={}ifedg:labels_edges={edge:G.edges[edge]['weight']foredgeinG.edges}else:labels_edges={edge:''foredgeinG.edges}# Division en 2 des aretes : solid et dashedelarge=[(u,v)for(u,v,w)inG.edges(data=True)ifw['styl']=='solid']esmall=[(u,v)for(u,v,w)inG.edges(data=True)ifw['styl']=='dashed']# positions for all nodes : # à mettre en parametre pour que chaque graphe ait la même disposition# pos = nx.spring_layout(G) # nodesnx.draw_networkx_nodes(G,pos,node_size=700,node_color=colorList,alpha=0.9)# labelsnx.draw_networkx_labels(G,pos,labels=labels_nodes, \
with_labels=True,font_size=20, \
font_color='black', \
font_family='sans-serif')# edgesifdashed:nx.draw_networkx_edges(G,pos,edgelist=elarge,width=3)nx.draw_networkx_edges(G,pos,edgelist=esmall,width=3,alpha=0.5,edge_color='b',style='dashed')else:nx.draw_networkx_edges(G,pos,width=1)nx.draw_networkx_edge_labels(G,pos,width=1,edge_labels=labels_edges,font_color='red')plt.axis('off')fichier='datas/'+nameplt.savefig(fichier)plt.show()