2012-04-30 36 views
14

Tôi đang sử dụng Python để mô phỏng quá trình diễn ra trên biểu đồ được chỉ dẫn. Tôi muốn tạo ra một hình ảnh động của quá trình này.Vẽ đồ thị có hướng dẫn bằng Python theo cách hiển thị tất cả các cạnh riêng biệt

Sự cố mà tôi gặp phải là hầu hết các thư viện trực quan hóa đồ thị Python đều kết hợp các cặp cạnh được hướng vào một cạnh duy nhất. Ví dụ, NetworkX rút chỉ có hai mép khi hiển thị đồ thị sau, trong khi tôi muốn hiển thị mỗi trong số bốn cạnh riêng:

import networkx as nx 
import matplotlib.pyplot as plt 

G = nx.MultiDiGraph() 

G.add_edges_from([ 
    (1, 2), 
    (2, 3), 
    (3, 2), 
    (2, 1), 
]) 

plt.figure(figsize=(8,8)) 
nx.draw(G) 

Output from NetworkX; parallel edges are overlapping, so only two lines are displayed

Tôi muốn hiển thị một cái gì đó như thế này, với mỗi cạnh song song rút ra cách riêng biệt:

Desired output format; parallel edges are drawn separately

câu hỏi R reciprocal edges in igraph in R dường như để đối phó với các vấn đề tương tự, nhưng giải pháp có dành cho thư viện igraph R, không phải thư viện Python.

Có cách nào dễ dàng để tạo kiểu âm mưu này bằng cách sử dụng thư viện trực quan hóa biểu đồ Python hiện có không? Nó sẽ là một tiền thưởng nếu nó có thể hỗ trợ nhiều chữ.

Tôi đang mở cho các giải pháp gọi chương trình bên ngoài để tạo hình ảnh. Tôi muốn tạo ra một loạt các khung hình hoạt hình, vì vậy giải pháp phải được tự động hóa.

+0

Related http://stackoverflow.com/questions/15053686/networkx-overlappin g-edge-when-visualizing-multigraph –

Trả lời

15

Công cụ Graphviz xuất hiện để hiển thị các cạnh riêng biệt.

Ví dụ, cho này:

digraph G { 
    A -> B; 
    A -> B; 
    A -> B; 
    B -> C; 

    B -> A; 
    C -> B; 
} 

để dot sản xuất:

example graph

ngôn ngữ đầu vào Graphviz là khá đơn giản, do đó bạn có thể tạo ra nó trên của riêng bạn, mặc dù tìm kiếm "python graphviz "không bật lên một vài thư viện.

+2

Nó chỉ ra rằng NetworkX có thể [export .dot files bằng cách sử dụng pydot] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_pydot) hoặc [pygraphviz] (http://networkx.lanl.gov/reference/drawing.html#module-networkx.drawing.nx_agraph), do đó, công trình này hoàn hảo. Cảm ơn! –

9

Sử dụng NetworkX, một cách giải quyết có thể mà tránh tập tin I/O và sử dụng dấu chấm qua pydot cho bố trí là:

import networkx as nx 
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
from cStringIO import StringIO 

g = nx.dodecahedral_graph() 
d = nx.drawing.nx_pydot.to_pydot(g) # d is a pydot graph object, dot options can be easily set 
# attributes get converted from networkx, 
# use set methods to control dot attributes after creation 

png_str = d.create_png() 
sio = StringIO() # file-like string, appropriate for imread below 
sio.write(png_str) 
sio.seek(0) 

img = mpimg.imread(sio) 
imgplot = plt.imshow(img) 

cho lý do tại sao seek(0) là cần thiết, xem How to create an image from a string in python

Nếu trong IPython (qt) giao diện điều khiển, sau đó ở trên sẽ in nội tuyến và tiếp cận trực tiếp hơn là:

import networkx as nx 
from IPython.display import Image 

g = nx.dodecahedral_graph() 
d = nx.drawing.nx_pydot.to_pydot(g) 

png_str = d.create_png() 
Image(data=png_str) 
+0

Ví dụ này cần được cập nhật: 'nx.to_pydot' không còn khả dụng nữa. Thay vào đó, bạn nên 'pip install pydotplus' và sau đó sử dụng' nx.drawing.nx_pydot.to_pydot' để thay thế. – ogrisel

+1

Cảm ơn bạn đã nâng cao nhu cầu cập nhật ví dụ này, tôi đã cập nhật nó. 'pydotplus' đã được hoàn nguyên về' pydot' trong luồng 'networkx', vui lòng xem [this PR] (https://github.com/networkx/networkx/pull/2272). –

+0

Nếu pydotplus không tìm thấy instalation 'graphviz' của bạn, nó sẽ ném' InvocationException: Không thể tìm thấy tệp thực thi của GraphViz'. Cách giải quyết là thêm nó vào đường dẫn hệ thống để thực hiện hiện tại như sau: 'import os' rồi' os.environ ["PATH"] + = r "; C: \ Anaconda \ envs \ testes \ Library \ bin \ graphviz" ' nơi bạn nên thay thế thư mục nơi thực thi graphviz của bạn. – mvbentes

Các vấn đề liên quan