2013-06-29 16 views
19

Ich habe Probleme mit großen Graph Visualisierung in Python und networkx. Der Graph ist wünschen zu visualisieren ist gerichtet, und hat eine Kante und Vertex-Set-Größe von 215.000 Aus der Dokumentation (die auf der obersten Seite verknüpft ist) ist klar, dass networkx unterstützt Plotten mit matplotlib und GraphViz. In matplotlib und NetworkX der Zeichnung erfolgt wie folgt:große Graph Visualisierung mit Python und Netzwerk x

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

ich einen Speicherfehler nach nx.draw(g) bekommen, danach würden Sie normalerweise plt.show() oder plt tun [some_function], um die Datei in einem Format für eine effiziente zu speichern und so weiter. .

Als nächstes habe ich GraphViz versucht. Vom wikipedia page das dot Format wird für gerichtete Graphen verwendet und habe ich eine Punkt-Datei:

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

Das gut gearbeitet und ich hatte eine Punktdatei in meinem aktuellen Verzeichnis, das 12 Megabyte. Weiter lief ich das dot Programm (Teil graphviz eine Postscript-Datei zu erstellen):

dot -Tps g.dot -o g.ps 

Das ist mein Computer verlangsamt, läuft ein paar Minuten und dann Killed im Terminal angezeigt werden soll. So konnte es niemals ausgeführt werden ... Beim Lesen der Dokumentation für graphviz scheint es, dass nur ungerichtete Graphen für große Graphvisualisierungen unterstützt wurden.

Frage: Mit diesen beiden erfolglosen Versuchen, kann mir jemand zeigen, wie meine große Grafik mit Python und NetworkX mit über 215.000 Ecken und 215.000 Kanten sichtbar zu machen? Ich vermute, dass ich wie bei Graphviz in ein Zwischenformat ausgeben muss (obwohl dies nicht so schwer sein sollte, wird es nicht so einfach sein wie eine eingebaute Funktion) und dann ein anderes Werkzeug verwenden, um das Zwischenformat zu lesen und dann eine Visualisierung auszugeben .

Also, ich bin auf der Suche nach folgenden Kriterien:

  1. Output Graph von NetworkX in ein Zwischenformat
  2. Mit neuen Paket/Software/Tool (idealerweise Python-interactive) Zwischenformat lesen und visualisieren, die große graph

Wenn Sie weitere Informationen benötigen, lassen Sie es mich wissen!

+1

Stellen Sie sich vor, Sie haben ein PostScript-Bild dieses großen Graphen erstellt. Was würdest du damit machen? Angenommen, Sie haben 10 Sekunden lang jeden Knoten betrachtet. Sie würden fast 25 Tage brauchen, um den gesamten Graphen zu inspizieren. Es scheint mir eher, als das Ganze (als ein PostScript-Bild) anzuzeigen, dass Sie einen Weg brauchen, um auf interessierende Teilgraphen "hineinzuzoomen". – unutbu

+0

Ich möchte eine Vorstellung davon bekommen, wie meine Grafik aussieht. Nachdem ich eine Idee habe, werde ich mich auf Subgraphen, Cliquen, Communities konzentrieren ... – CodeKingPlusPlus

Antwort

14
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 

Dies beantwortet Ihre erste Ausgabe. Networkx verfügt nicht über die Möglichkeit zum Zoomen in Knoten. Verwenden Sie Gephi für diese Funktionalität. Gephi akzeptiert eine Kantenliste im CSV-Format und erzeugt eine Visualisierung, in der das Zoomen interaktiv erfolgen kann.

+0

Ich habe gerade eine networkx-Funktion verwendet, um das Diagramm in einem Editierlisten-Format zu speichern und es in Gephi! – CodeKingPlusPlus