2013-06-29 164 views
19

Tôi gặp sự cố khi hiển thị đồ thị lớn trong python và networkx. Biểu đồ muốn hiển thị trực tiếp, và có kích thước cạnh và đỉnh được đặt là 215.000 Từ tài liệu (được liên kết ở đầu trang) rõ ràng là hỗ trợ networkx vẽ bằng matplotlib và GraphViz. Trong matplotlib và networkx bản vẽ được thực hiện như sau:hiển thị đồ thị lớn với python và networkx

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

tôi nhận được một lỗi bộ nhớ sau khi nx.draw(g), sau đó bạn vẫn thường làm plt.show() hoặc plt [some_function] để lưu các tập tin trong một định dạng cho hiệu quả và vân vân. .

Tiếp theo tôi đã thử GraphViz. Từ wikipedia page định dạng dot được sử dụng cho đồ thị có hướng và tôi đã tạo một dấu chấm file:

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

này làm việc tốt và tôi đã có một dấu chấm tập tin trong thư mục hiện tại của tôi là 12 MB. Tiếp theo, tôi chạy chương trình dot (một phần của graphviz để tạo ra một tập tin postscript):

dot -Tps g.dot -o g.ps 

này làm chậm máy tính của tôi, chạy trong một vài phút và sau đó hiển thị Killed tại nhà ga. Vì vậy, nó không bao giờ có thể thực hiện ... Trong khi đọc tài liệu cho graphviz có vẻ như chỉ có đồ thị không được kiểm soát được hỗ trợ để hiển thị đồ thị lớn.

Câu hỏi: Với những hai lần thất bại bất cứ ai có thể chỉ cho tôi làm thế nào để hình dung đồ thị lớn của tôi sử dụng python và networkx với khoảng 215.000 đỉnh và 215.000 cạnh? Tôi nghi ngờ như với Graphviz tôi sẽ phải xuất sang định dạng trung gian (mặc dù điều này không khó đến mức nó sẽ không dễ dàng như hàm dựng sẵn) và sau đó sử dụng công cụ khác để đọc định dạng trung gian rồi xuất hiện trực quan .

Vì vậy, tôi đang tìm kiếm những điều sau đây:

  1. Output đồ thị từ networkx thành một định dạng trung gian
  2. Với mới gói/phần mềm/công cụ (lý tưởng python tương tác) đọc định dạng trung gian và hình dung lớn biểu đồ

Nếu bạn cần thêm thông tin, hãy cho tôi biết!

+1

Hãy tưởng tượng bạn đã thành công trong việc tạo hình ảnh PostScript của biểu đồ lớn này. Bạn sẽ làm gì với nó? Giả sử bạn dành 10 giây để xem mỗi nút. nó sẽ đưa bạn gần 25 ngày để kiểm tra toàn bộ đồ thị. Dường như với tôi hơn là hiển thị toàn bộ điều (như một hình ảnh PostScript), bạn cần một số cách để "phóng to" trên các đồ thị quan tâm. – unutbu

+0

Tôi muốn có ý tưởng về đồ thị của tôi trông như thế nào. Sau khi tôi có một ý tưởng, tôi sẽ tập trung vào các biểu đồ con, đồ cổ, cộng đồng ... – CodeKingPlusPlus

Trả lời

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 

Điều này trả lời vấn đề đầu tiên của bạn. Networkx không có cơ sở để phóng to các nút. Sử dụng Gephi cho chức năng này. Gephi chấp nhận danh sách cạnh ở định dạng CSV và tạo hình ảnh trực quan, nơi việc phóng to có thể được thực hiện tương tác.

+0

Tôi vừa sử dụng chức năng networkx để lưu đồ thị theo định dạng edgelist và có thể đọc nó vào Gephi! – CodeKingPlusPlus