2013-06-29 30 views
19

Python ve networkx numaralı grafiklerde geniş grafik görselleştirme ile ilgili sorun yaşıyorum. Grafiğin görselleştirilmesi arzu edilir ve 215.000'lik bir kenar ve köşe büyüklüğü ayarına sahiptir. Belgelenmeden (üst sayfada bağlanmıştır), ağx'in matplotlib ve GraphViz ile çizim yapmayı desteklediği açıktır. python ve networkx ile geniş grafik görselleştirme

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

Ben nx.draw(g) sonra bir bellek hatası alıyorum sonradan normalde plt.show() veya plt yapacağını, [some_function] benzeri etkin ve bir formatta dosyayı kaydetmek için şu şekildedir: matplotlib ve networkx çizimde yapılır. .

Sonraki GraphViz'i denedim. wikipedia page itibaren dot biçimi yönettiği grafikler için kullanılan ve bir nokta dosyası oluşturulur:

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

Bu iyi çalıştı ve ben 12 megabayt olan benim geçerli dizinde bir nokta dosyası vardı. Bu bilgisayarımı yavaşlatır

dot -Tps g.dot -o g.ps 

, birkaç dakika için çalışır ve daha sonra terminalde Killed görüntüler: Sonraki ben dot programı (bir postscript dosyası oluşturmak için graphviz parçası) koştu. Bu yüzden hiçbir zaman idam edilemezdi ... Grafikler için belgeleri okurken büyük grafik görselleştirme için sadece doğrulanmamış grafikler destekleniyor gibi görünüyor.

Soru: Bu iki başarısız denemeden ile herkes nasıl 215.000 köşe ve 215.000 kenarlı piton ve networkx kullanarak büyük bir grafik görselleştirmek için bana gösterebilir? Ben Graphviz gibi bir ara bir biçime çıkması gerekeceğinden şüpheleniyorum (bu kadar zor olmamalı, bir yerleşik fonksiyon kadar kolay olmayacak) ve sonra ara formatı okumak için başka bir araç kullanmalı ve sonra bir görselleştirme çıktı .

Yani, aşağıdaki arıyorum: Yeni paket/yazılım/aracı ile bir ara formatta

  • içine networkx den

    1. Çıktı grafiğinde (ideal piton-etkileşimli) ara formatında okumak ve büyük görselleştirmek grafiği

    Daha fazla bilgiye ihtiyacınız olursa lütfen bildirin!

  • +1

    Bu büyük grafiğin PostScript görüntüsünü oluşturmayı başardığını düşünün. Onunla ne yapacaksın? Her bir düğüme 10 saniye harcadığınızı varsayalım. grafiğin tamamını incelemek neredeyse 25 gün sürer. Bana öyle geliyor ki, bir şeyi (bir PostScript görüntüsü olarak) görüntülemek yerine, ilgilendiğiniz altyazılarda "yakınlaştırmak" için bir yol gerekiyor. – unutbu

    +0

    Grafiğimin neye benzediğine dair bir fikir edinmek istiyorum. Bir fikrimden sonra altyazılara, kliklere, topluluklara odaklanacağım ... – CodeKingPlusPlus

    cevap

    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 
    

    Bu, ilk sorununuza cevap verir. Networkx, düğümleri yakınlaştırma olanağına sahip değildir. Bu işlev için Gephi'yi kullanın. Gephi, CSV formatında bir kenar listesini kabul eder ve yakınlaştırmanın etkileşimli olarak yapılabildiği bir görselleştirme üretir.

    +0

    Grafiği bir edgelist biçimde kaydetmek için bir ağ işlevi kullandım ve Gephi'ye okuyabiliyordum! – CodeKingPlusPlus

    İlgili konular