2013-06-29 19 views
19

Ho problemi con la visualizzazione di grafici di grandi dimensioni in python e networkx. Il grafico che si desidera visualizzare è diretto e ha una dimensione del bordo e del vertice di 215.000 Dalla documentazione (che è collegata alla pagina principale) è chiaro che networkx supporta la stampa con matplotlib e GraphViz. In matplotlib e NetworkX il disegno è fatto come segue:visualizzazione grafico di grandi dimensioni con python e networkx

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

ottengo un errore di memoria dopo nx.draw(g), poi si farebbe normalmente plt.show() o PLT [una_qualche_funzione] per salvare il file in un formato per un efficiente e così via. .

Successivamente ho provato GraphViz. Dal wikipedia page il formato dot viene utilizzato per grafi orientati e ho creato un file di punti:

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

Questo ha funzionato bene e ho avuto un file di punti nella mia directory corrente che è di 12 megabyte. Poi ho fatto funzionare il programma di dot (parte di graphviz per creare un file PostScript):

dot -Tps g.dot -o g.ps 

Questo rallenta il mio computer, corre per qualche minuto e quindi visualizzare Killed nel terminale. Quindi non ha mai potuto eseguire ... Durante la lettura della documentazione per graphviz sembra che solo i grafici non orientati fossero supportati per la visualizzazione di grafici di grandi dimensioni.

Domanda: Con questi due tentativi falliti qualcuno può mostrarmi come visualizzare il mio grafico di grandi dimensioni utilizzando Python e NetworkX con circa 215.000 vertici e 215.000 bordi? Ho il sospetto che con Graphviz dovrò produrre un formato intermedio (anche se questo non dovrebbe essere così difficile non sarà facile come una funzione integrata) e poi usare un altro strumento per leggere il formato intermedio e quindi produrre una visualizzazione .

Quindi, sto cercando il seguente:

  1. grafico di uscita da NetworkX in un formato intermedio
  2. Con nuovo pacchetto/software/strumento (idealmente python-interattivo) leggere il formato intermedio e visualizzare la grande grafico

Se hai bisogno di maggiori informazioni fammi sapere!

+1

Immagina di riuscire a creare un'immagine PostScript di questo grafico di grandi dimensioni. Cosa ne faresti? Supponi di aver speso 10 secondi guardando ciascun nodo. ci vorrebbero quasi 25 giorni per ispezionare l'intero grafico. Mi sembra piuttosto che visualizzare l'intera cosa (come una immagine PostScript) è necessario un modo per "ingrandire" su sottografi di interesse. – unutbu

+0

Mi piacerebbe avere un'idea di come appare il mio grafico. Dopo che ho un'idea mi concentrerò su sottografi, cricche, comunità ... – CodeKingPlusPlus

risposta

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 

Questo risponde al primo problema. Networkx non ha la possibilità di ingrandire i nodi. Usa Gephi per questa funzionalità. Gephi accetta un elenco di spigoli nel formato CSV e produce una visualizzazione, in cui lo zoom può essere fatto in modo interattivo.

+0

Ho appena usato una funzione networkx per salvare il grafico in un formato di un edgelist ed è stato in grado di leggerlo in Gephi! – CodeKingPlusPlus

Problemi correlati