<p>使用<a href="http://www.graphviz.org/" rel="nofollow noreferrer">graphviz</a>您可以制作这样的图表</p>
<p><img src="https://i.stack.imgur.com/Qru9i.png" alt="alt text"/></p>
<p>使用这样的代码:</p>
<pre><code>#!/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)
</code></pre>
<p>通常,从命令行调用graphviz<code>dot</code>程序。它本身与Python无关。</p>
<p>但是,要以编程方式制作图表,可以使用Python将<code>dot</code>代码构造为一个巨大的字符串,并使用<code>subprocess.Popen</code>通过<code>dot</code>来处理字符串。<code>dot</code>可以多种格式输出,包括SVG或PNG。或者,您可能想研究<a href="http://networkx.lanl.gov/pygraphviz/" rel="nofollow noreferrer">pygraphviz</a>,以获得一个更“Pythonic”的graphviz库接口。</p>
<p>另外请注意,graphviz支持UTF-8编码字符,因此您可以通过在UTF-8字符集中找到适当的符号来在图表中包含下标和其他数学符号。</p>
<p>graphviz的一个优点是您不必繁琐地指定图的布局,只需说明哪些节点连接到其他节点。节点的位置是由graphviz自动确定的。</p>
<p>这种优势也有点让人衰弱——很难像您希望的那样在图中放置元素。例如,请注意,S1和S2没有水平对齐。我也不知道如何使S0>;S1中的箭头更优美地弯曲,S1和S2之间的箭头完全对称,或者如何使来自S2>;S1的边缘标签显示在箭头下方,等等。。。
我可能不知道该怎么做。</p>
<p>有关graphviz可以做什么的更多示例,请参见<a href="http://www.graphviz.org/Gallery.php" rel="nofollow noreferrer">graphviz gallery</a>。</p>