2015-11-13 1 views
0

J'ai un programme qui génère mon graphique et l'affiche sur une seule figure.python networkx- enregistrer des graphiques déconnectés d'un seul chiffre dans des fichiers séparés

Edges2 = [(1, 2), (1, 3), (1, 4), (4, 5), (6, 7), (6,8)]

G = nx.DiGraph()

la fonction qui génère le graphe est le suivant:

def create_graph(G,nodes,Sets): 

G.add_edges_from(nodes) 

#value assigned to each world 
custom_labels={} 
custom_node_sizes={} 
node_colours=['y'] 

for i in range(0, len(Sets)): 
    custom_labels[i+1] = Sets[i] 
    custom_node_sizes[i+1] = 5000 
    if i < len(Sets): 
     node_colours.append('b') 



nx.draw(G,labels=custom_labels,node_list = nodes,node_color=node_colours, node_size=custom_node_sizes.values()) 
#show with custom labels 
plt.show() 

à la fonction ci-dessus je passe la liste des arêtes (Edges2). La fonction génère deux graphiques déconnectés sur une seule figure. Cependant, j'aimerais sauvegarder ces deux graphiques séparément.

Donc, fondamentalement, existe-t-il un moyen de sauvegarder deux graphiques déconnectés dans deux fichiers? Donc, je peux obtenir graph1.png et graph2.png.

+0

Qu'est-ce que vous envoyez comme une entrée 'Définit' à la fonction? –

Répondre

1

Je n'ai pas tout à fait obtenu l'entrée 'Sets' à votre fonction ou pourquoi add_edges_from(nodes) vous utilisez des nœuds en entrée et non des bords !. Donc, pour répondre à votre question de tracer des graphes déconnectés dans 2 fichiers séparés, j'ai reproduit le problème sans custom_labels car cela dépend de l'entrée 'Sets' et j'ai envoyé le Edges2 comme une entrée pour les nœuds et les Sets aussi. Comme suggéré par @joel j'ai utilisé la fonction weakly_connected_component_subgraphs, puis bouclé la sortie de la fonction enregistrer chaque graphique séparément. Donc, à la fin, le graphique original est enregistré dans original_graph.png, les sous-graphiques sont enregistrés dans graph1.png et graph2.png respectivement.

def create_graph(G,nodes,Sets): 
    G.add_edges_from(nodes) 

    #value assigned to each world 
    custom_labels={} 
    custom_node_sizes={} 
    node_colours=['y'] 

    for i in range(0, len(Sets)): 
     custom_labels[i+1] = Sets[i] 
     custom_node_sizes[i+1] = 5000 
     if i < len(Sets): 
      node_colours.append('b') 
    nx.draw(G,node_list = nodes,node_color=node_colours, node_size=1000, with_labels = True) 
    plt.savefig("original_graph.png") 
    plt.show() 
    G_comp = nx.weakly_connected_component_subgraphs(G) 
    i = 1 
    for comp in G_comp: 
     nx.draw(comp,node_color=node_colours, node_size=1000, with_labels=True) 
     #show with custom labels 
     fig_name = "graph" + str(i) + ".png" 
     plt.savefig(fig_name) 
     plt.show() 
     i += 1 


Edges2 = [(1, 2), (1, 3), (1, 4), (4, 5), (6, 7), (6,8)] 
G = nx.DiGraph() 
create_graph(G,Edges2,Edges2) 

graphique originale enter image description here

graph1 et graph2 enter image description here

SOUS LA DIRECTION DE AKI: J'ai ajouté les étiquettes que je avais besoin (voir commentaires). La dernière partie du code est:

i = 1 
    custom_number = 1; 
    for comp in G_comp: 
     dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ]) 
     wanted_keys = (range(custom_number,custom_number + len(comp))) 
     newdict = dictfilt(custom_labels, wanted_keys) 

     nx.draw(comp,node_color=node_colours, node_size=1000, with_labels=True, labels = newdict) 
     #show with custom labels 
     fig_name = "graph" + str(i) + ".png" 
     plt.savefig(fig_name) 
     plt.show() 
     custom_number += len(comp) 
     i += 1 

Cette version améliorée récupère les données nécessaires du dictionnaire. Un grand merci à @author de la réponse

+0

La liste des ensembles pourrait être la suivante: Sets2 = [[('ou', 'r', 't')], [('not', 'r'), 'r'], [('non', 's'), 'r'], ['r'], [('box', 's')], [('box', 'b')], [('box', 'b') ], [('box', 'c')]] – aki

+0

Et en fait si j'utilise mes étiquettes ça ne me donne pas les graphes corrects, le graphique2 me donne une erreur. Y a-t-il un moyen de permettre à ces étiquettes personnalisées d'être présentes sur les deux graphiques séparés? Mes étiquettes fonctionnent bien avec le graphique d'origine mais avec l'erreur de graphes séparés est présent – aki

+0

Je n'ai toujours pas ce que représente 'Sets' mais en général si vous voulez afficher des étiquettes, vous devez créer un dictionnaire ** labels ** met en correspondance chaque noeud avec une étiquette, puis nx.draw (G, labels = labels, with_labels = True) –

0

depuis votre graphique est dirigé, vous devez extraire composants fortement connectés de votre graphique:

graphs = nx.strongly_connected_component_subgraphs(G) 

plus de détails peuvent être trouvés here
il y a d'autres méthodes utiles pour les composants qui vous pouvez trouver here

+0

'connected_component_subgraphs' ne donne pas les composants ** fortement ** connectés, et en fait n'est pas écrit pour les graphes orientés. Vous vouliez dire 'strong_connected_component_subgraphs'. ** Cependant ** Je pense que l'OP veut réellement des composants faiblement connectés: 'weakly_connected_component_subgraphs'.Cela aiderait aussi si votre réponse donnait des instructions sur la façon de tracer les composants séparément. – Joel

+0

ouais vous aviez raison, je voulais dire comp fortement connecté mais j'ai ajouté le mauvais code.Merci;) –

+0

Je vais le tester plus tard aujourd'hui, mais si quelqu'un a écrit une fonction similaire dont j'ai besoin s'il vous plaît partager :). – aki