web-dev-qa-db-ja.com

pydotを使用して保存せずにグラフを表示する

Pydotを使って簡単なグラフを表示しようとしています。

私の質問は、グラフをファイルに書き込まずに表示する方法はありますか。現在、書き込み関数を使用して最初に描画し、次にImageモジュールを使用してファイルを表示する必要があるためです。

しかし、グラフを保存せずに直接画面に印刷する方法はありますか?


また、更新として、この同じ質問で、Imageモジュールのshowコマンドを使用すると画像が非常にすばやく保存される一方で、画像が表示されるまでにかなりの時間がかかることを確認したいと思います。画像が削除されたか、利用できない場所に保存されたため、画像を開くことができなかったというエラーが表示されます。これは、デスクトップに保存しているため正しくありません。画像をロードするには.....

どうもありがとう....

20
user506710

pydotgraphvizを使用してグラフをレンダリングしているのではないかと思います。つまり、実行可能ファイルを実行し、結果のイメージをロードします。

結論-いいえ、ファイルの作成を避けることはできません。

0
nimrodm

ディスクにファイルを書き込まずにpydotGraphVizを呼び出すことにより、dotからイメージをレンダリングできます。次に、それをプロットします。これは、gpydotグラフであると仮定して、次のように実行できます。

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)

matplotlibnetworkx機能は 厳しく制限されています そのようなグラフではあるため、これは有向グラフに特に役立ちます。

この プルリクエスト も参照してください。これは、このような機能をnetworkxに直接導入します。残っているのは、ファイル交換でGraphVizのレイアウトとしてMATLABによって生成されたレイアウトをロードしてプロットするためのインターフェイスを誰かが作成することです GraphVizインターフェイスMATLAB GraphVizレイアウトインポーター 、- GraphViz4Matlab

22

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)
18
micahscopes

この回答 (Pythonで画像を表示する方法)に基づいて、ここにいくつかの行があります:

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

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

ImagePython Imaging Library からのものです

3
Andre Holzner