質問
Pydotを使用して簡単なグラフを表示しようとしています。
私の質問は、ファイルに書き込みせずにグラフを表示する方法があるということです。現在、書き込み関数を使用して最初に描画し、次に画像モジュールを使用してファイルを表示する必要があります。
しかし、保存されずにグラフが画面に直接印刷される方法はありますか?
また、更新として、この同じ質問で、画像モジュールのshowコマンドを使用すると画像が非常に迅速に保存されている間、画像が見られるまでに顕著な時間がかかることを観察したいと思います。画像は、デスクトップで保存しているので正しくない場所で削除または保存されたために画像を開くことができないというエラーがあります.....誰かが何が起こっているのか知っていて、より速い方法がありますか画像をロードするには.....
どうもありがとう....
解決
私は怖いです pydot
使用します graphviz
グラフをレンダリングします。つまり、実行可能ファイルを実行し、結果の画像をロードします。
結論 - いいえ、ファイルの作成を避けることはできません。
他のヒント
から画像をレンダリングできます pydot
電話することによって GraphViz
's dot
ディスクにファイルを書き込むことなく。次に、それをプロットします。これは、次のように実行できます g
aです 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)
これは、指示されたグラフに特に役立ちます。 matplotlib
の機能 networkx
それは 厳しく制限されています そのようなグラフの場合。
これも参照してください リクエストをプルします, 、そのような機能を直接導入します networkx
. 。残っているのは、誰かがインターフェイスを書き、生成されたレイアウトをロードしてプロットすることです GraphViz
のように MATLAB
ファイル交換 GraphVizインターフェイス, MATLAB GraphVizレイアウトインポーター, GraphViz4Matlab
.
iPythonを使用した簡単なソリューションは次のとおりです。
from IPython.display import Image, display
def view_pydot(pdot):
plt = Image(pdot.create_png())
display(plt)
使用例:
import networkx as nx
to_pdot = nx.drawing.nx_pydot.to_pydot
pdot = to_pdot(nx.complete_graph(5))
view_pydot(pdot)
に基づく この答え (Pythonで画像を表示する方法)、ここにいくつかの行があります:
gr = ... <pydot.Dot instance> ...
import tempfile, Image
fout = tempfile.NamedTemporaryFile(suffix=".png")
gr.write(fout.name,format="png")
Image.open(fout.name).show()
Image
からです Pythonイメージングライブラリ