2011-01-04 28 views
13

Tôi đang cố gắng hiển thị biểu đồ đơn giản bằng cách sử dụng pydot.Hiển thị biểu đồ mà không lưu bằng cách sử dụng pydot

Câu hỏi của tôi là có cách nào để hiển thị biểu đồ mà không cần viết nó vào tệp như hiện tại tôi sử dụng chức năng ghi để vẽ đầu tiên và sau đó phải sử dụng mô-đun Hình ảnh để hiển thị tệp.

Tuy nhiên có cách nào để đồ thị được in trực tiếp trên màn hình mà không được lưu không ??


Cũng như một bản cập nhật Tôi muốn hỏi trong câu hỏi này tương tự mà tôi nhận thấy rằng trong khi hình ảnh được lưu rất nhanh chóng khi tôi sử dụng lệnh show của các mô-đun hình ảnh phải mất thời gian đáng kể cho hình ảnh được nhìn thấy .... Ngoài ra đôi khi tôi nhận được lỗi rằng hình ảnh could'nt được mở bởi vì nó đã bị xóa hoặc lưu ở vị trí không có sẵn mà không phải là chính xác như tôi đang lưu nó tại Desktop của tôi ..... Có ai biết những gì xảy ra và có cách nào nhanh hơn để có được những hình ảnh được tải .....

Thanks a lot ....

+0

liên quan: http://stackoverflow.com/questions/10379448/plotting-directed-graphs-in-python -in-a-way-that-show-all-edge-riêng/17823100 # 17823100 –

Trả lời

2

tôi sợ pydot sử dụng graphviz để hiển thị biểu đồ. Tức là, nó chạy tệp thực thi và tải hình ảnh kết quả.

Tóm lại - không, bạn không thể tránh tạo tệp.

+1

có cách nào để mở tệp nhanh chóng không ??? Cảm ơn rất nhiều vì câu trả lời –

+1

johntex đã cung cấp giải pháp – elgehelge

+0

xem giải pháp của tôi. nó đơn giản và tránh tạo một tệp :) – micahscopes

3

Dựa trên this answer (làm thế nào để hiển thị hình ảnh trong python), đây là một vài dòng:

gr = ... <pydot.Dot instance> ... 

import tempfile, Image 
fout = tempfile.NamedTemporaryFile(suffix=".png") 
gr.write(fout.name,format="png") 
Image.open(fout.name).show() 

Image là từ Python Imaging Library

17

Bạn có thể làm cho hình ảnh từ pydot bằng cách gọi GraphViz 's dot mà không cần ghi bất kỳ tệp nào vào đĩa. Sau đó, chỉ cần vẽ nó. Điều này có thể được thực hiện như sau, giả sử g là một đồ thị pydot:

from cStringIO import StringIO 

import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
import networkx as nx 

# create a networkx graph 
G = nx.MultiDiGraph() 
G.add_nodes_from([1,2]) 
G.add_edge(1, 2) 

# convert from networkx -> pydot 
pydot_graph = G.to_pydot() 

# render pydot by calling dot, no file saved to disk 
png_str = pydot_graph.create_png(prog='dot') 

# treat the dot output string as an image file 
sio = StringIO() 
sio.write(png_str) 
sio.seek(0) 
img = mpimg.imread(sio) 

# plot the image 
imgplot = plt.imshow(img, aspect='equal') 
plt.show(block=False) 

Điều này đặc biệt hữu ích cho các đồ thị có hướng, bởi vì khả năng của matplotlibnetworkxseverely limited cho đồ thị như vậy.

Xem thêm điều này pull request, trong đó giới thiệu các khả năng đó trực tiếp đến networkx. Phần còn lại dành cho ai đó để viết giao diện để tải và vẽ bố cục được tạo bởi GraphViz làm giao diện cho MATLAB trên Trao đổi tệp GraphViz interface, MATLAB GraphViz Layout importer, GraphViz4Matlab.

+3

Giống như một phụ lục nhanh, nếu bạn đang ở trong sổ ghi chép, bạn có thể hiển thị 'png_str' (byte) trực tiếp bằng cách sử dụng' Hình ảnh (png_str) '(từ' IPython.display'). – meloncholy

+0

Thực hiện một số điều chỉnh nhỏ trong việc thích ứng này: https://github.com/EricCousineau-TRI/repro/blob/d74ecbd4fdfdaa115bf28b2db15c7e296553435d/python/matplotlib/graphviz.py#L9 Cảm ơn bạn đã đăng mã này! (Đã kết thúc bằng cách sử dụng 'pydot', vì nó có thể xử lý biểu đồ quan tâm trong trường hợp này.) –

+1

@EricCousineau Theo tuyên bố' g = pydot.graph_from_dot_data (dot_text) ', có vẻ như bạn đang sử dụng một' pydot cũ hơn 'phiên bản. Xin lưu ý rằng với 'pydot == 1.2.3', hàm' graph_from_dot_data' trả về một 'danh sách' trong mọi trường hợp (trong các phiên bản trước nó trả về một đồ thị khi singleton). Xem thêm [nhận xét này] (https://github.com/erocarrera/pydot/issues/159#issuecomment-334799706) và https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/pydot.py#L235 , https://github.com/erocarrera/pydot/blob/35a8d858bd9da0b37268fe9b317fe4895387e75f/dot_parser.py#L545. –

6

Dưới đây là một giải pháp đơn giản sử dụng IPython:

from IPython.display import Image, display 

def viewPydot(pdot): 
    plt = Image(pdot.create_png()) 
    display(plt) 

Ví dụ sử dụng:

import networkx as nx 
toPdot = nx.drawing.nx_pydot.to_pydot 
pdot = toPdot(nx.complete_graph(5)) 
viewPydot(pdot) 
Các vấn đề liên quan