あなたは、このようなコードを使用して、この
のような図を作ることができgraphvizを使用する:
#!/usr/bin/env python
# coding: utf-8
import os
import subprocess
import shlex
# dot code based on http://www.graphviz.org/Gallery/directed/fsm.html
dot='''
digraph finite_state_machine {
bgcolor="#ffffff"
rankdir=LR;
size="8,5"
node [shape = doublecircle]; S₁ S₃;
node [shape = circle]; S₀ S₂ S₄;
node [shape = circle]; S₄;
S₀ -> S₁ [ label = ε, weight=-1 ];
S₀ -> S₃ [ label = ε, weight=-1 ];
S₁ -> S₂:nw [ label = 0 ];
S₂ -> S₁:se [ label = 0 ];
S₁ -> S₁ [ label = 1 ];
S₂ -> S₂ [ label = 1 ];
S₃ -> S₄:nw [ label = 1 ];
S₄ -> S₃:se [ label = 1 ];
S₃ -> S₃ [ label = 0 ];
S₄ -> S₄ [ label = 0 ];
}
'''
os.chdir('/tmp')
with open('output_dot.svg','w') as outfile:
subprocess.Popen(shlex.split('dot -Tsvg'),
stdin=subprocess.PIPE,stdout=outfile).communicate(dot)
通常、一つはコマンドラインからgraphvizのdot
プログラムを呼び出します。 Python自体とは何の関係もありません。図は、プログラムで、しかし、あなたは巨大な文字列としてdot
コードを構築するためのPythonを使用して、dot
て文字列を処理するためにsubprocess.Popen
を使用することができようにするに
。 dot
は、SVGやPNGを含む多くの形式で出力できます。あるいは、graphvizライブラリとのより「Pythonic」インターフェースのためにpygraphvizを調査したいかもしれません。
graphvizはUTF-8でエンコードされた文字をサポートしているため、UTF-8文字セットで適切なシンボルを見つけることで、ダイアグラムに下付き文字やその他の数学記号を含めることができます。
graphvizの強みの1つは、ダイアグラムのレイアウトを退屈に指定する必要がないということです。単に、どのノードが他のノードに接続されているかだけです。ノードの位置は、graphviz(主に)によって自動的に決定されます。
この強度はやや衰弱しています。図の要素を望みどおり正確に配置することは難しいです。たとえば、S1とS2が水平に整列していないことに注意してください。私はまた、S0→S1の矢印をもっときれいに湾曲させる方法、S1とS2の間の矢印を完全に対称にする方法、あるいはS2→S1のエッジラベルを矢印などの下に表示する方法を知らない。 これらのことすべてを行う方法があるかもしれませんが、私はどのようにわかりません。
graphvizができることの他の例については、graphviz galleryを参照してください。
チュートリアルhttp://zetcode.com/tutorials/pyqt4/が見当たらない場合は、参考になる場合があります。 –