web-dev-qa-db-fra.com

visualisation de grands graphes avec python et networkx

Je rencontre des problèmes avec la visualisation de grands graphes dans python et networkx . Le graphique que vous souhaitez visualiser est dirigé et a une taille d'ensemble de bord et de vertex de 215 000. documentation (qui est liée en haut de page), il est clair que networkx prend en charge le traçage avec matplotlib et GraphViz. Dans matplotlib et networkx, le dessin se fait comme suit:

import 
networkx as nx
import matplotlib.pyplot as plt
#Let g be a graph that I created
nx.draw(g)

J'obtiens une erreur de mémoire après nx.draw(g), ensuite vous feriez normalement plt.show() ou plt. [Some_function] pour enregistrer le fichier dans un format efficace et ainsi de suite.

Ensuite, j'ai essayé GraphViz. Depuis la page wikipedia le format dot est utilisé pour les graphiques dirigés et j'ai créé un fichier de points:

nx.write_dot(g, "g.dot")

Cela a bien fonctionné et j'avais un fichier dot dans mon répertoire actuel qui est de 12 mégaoctets. Ensuite, j'ai exécuté le programme dot (partie de graphviz pour créer un fichier postscript):

dot -Tps g.dot -o g.ps

Cela ralentit mon ordinateur, fonctionne pendant quelques minutes, puis affiche Killed dans le terminal. Il n'a donc jamais pu s'exécuter ... Lors de la lecture de la documentation de graphviz, il semble que seuls les graphiques non orientés ont été pris en charge pour la visualisation de grands graphiques.

Question : Avec ces deux tentatives infructueuses, quelqu'un peut-il me montrer comment visualiser mon grand graphique en utilisant python et networkx avec environ 215 000 sommets et 215 000 arêtes? Je soupçonne qu'avec Graphviz, je devrai produire dans un format intermédiaire (bien que cela ne devrait pas être si difficile que ce ne sera pas aussi facile qu'une fonction intégrée), puis utiliser un autre outil pour lire l'intermédiaire formater, puis produire une visualisation.

Je recherche donc les éléments suivants:

  1. Graphique de sortie de networkx dans un format intermédiaire
  2. Avec un nouveau package/logiciel/outil (idéalement interactif en python), lisez le format intermédiaire et visualisez le grand graphique

Si vous avez besoin de plus d'informations, faites-le moi savoir!

31
CodeKingPlusPlus
 from matplotlib import pylab
 import networkx as nx

 def save_graph(graph,file_name):
    #initialze Figure
    plt.figure(num=None, figsize=(20, 20), dpi=80)
    plt.axis('off')
    fig = plt.figure(1)
    pos = nx.spring_layout(graph)
    nx.draw_networkx_nodes(graph,pos)
    nx.draw_networkx_edges(graph,pos)
    nx.draw_networkx_labels(graph,pos)

    cut = 1.00
    xmax = cut * max(xx for xx, yy in pos.values())
    ymax = cut * max(yy for xx, yy in pos.values())
    plt.xlim(0, xmax)
    plt.ylim(0, ymax)

    plt.savefig(file_name,bbox_inches="tight")
    pylab.close()
    del fig

#Assuming that the graph g has nodes and edges entered
save_graph(g,"my_graph.pdf")

#it can also be saved in .svg, .png. or .ps formats

Cela répond à votre premier problème. Networkx n'a pas la possibilité de zoomer sur les nœuds. Utilisez Gephi pour cette fonctionnalité. Gephi accepte une liste Edge au format CSV et produit une visualisation, où le zoom peut être fait de manière interactive.

19
Vikram