使用 Graphviz 绘制流程图
流程图常用符号及对应的无样式 dot 语句[1]
形状 | 描述 | DOT |
---|---|---|
用来表达过程的次序,用一条线由一个符号连接去到另一个符号。如果不是标准的上至下、左至右图就会加上箭头 | -> |
|
用来表示次要或程式的开始与完结。常以一个圆角长方形表示。通常里面会标上“开始”或“结束”或其他相关字眼,如“提交查询”或“接受产品” | terminal [shape="plain" label=<<TABLE BORDER="1" CELLPADDING="4" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0"><TR><TD>起止符号</TD></TR></TABLE>>]; |
|
以长方形来代表一系列程序去改变数值、形式、数据的位置 | process [shape="rectangle" label="程序"]; |
|
以一个菱形去显示一个条件进程,用来按情况去决定下一步走向。通常以“是/否”或“真/假”值去决定 | decision [shape="diamond" label="决策判断"]; |
|
以平行四边形来标示数据输入或输出的过程,即填入数据或显示工作结果的步骤 | io [shape="parallelogram" label="输入/输出"]; |
|
用来补充某步骤的额外资讯,可用一个虚线来连接一个半闭合的长方型至想注释的符号中 | comment [shape="plain" margin=0 label=<<TABLE BORDER="1" SIDES="TBL" CELLPADDING="4" CELLBORDER="0" CELLSPACING="0"><TR><TD>注解</TD></TR></TABLE>>]; x -> comment [style="dotted" arrowhead="none"]; |
|
用一个有2条左右垂直线长方型,来表示一个已在其他地方定义了的过程 | predefined [shape="plain" label=<<TABLE CELLBORDER="1" CELLPADDING="4" CELLSPACING="0" BORDER="0"><TR><TD></TD><TD>已定义流程</TD><TD></TD></TR></TABLE>>]; |
|
用一个含有字母的小圆圈来连接目标流程画于同一页上 | onpage [shape="circle" label="同页参考"]; |
|
用一个倒画的屋型来表示目标流程画于另一页上 | offpage [shape="invhouse" label="换页参考"]; |
|
用一个圆柱来表示数据库 | db [shape="cylinder" label="数据档或资料库"]; |
|
用一个拉长了的六角形来代表初始化或预备的过程 | init [shape="hexagon" label="初始化"]; |
如果想要支持更复杂的符号, 请参见 How can I create custom shapes?
一个简单的流程图样例 (flowchart_demo.dot)[2]
digraph flowchart { // terminal [shape="plain" label=<<TABLE BORDER="1" CELLPADDING="4" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0"><TR><TD>起止符号</TD></TR></TABLE>>];
// process [shape="rectangle" label="程序"];
// decision [shape="diamond" label="决策判断"];
// io [shape="parallelogram" label="输入/输出"];
// comment [shape="plain" margin=0 label=<<TABLE BORDER="1" SIDES="TBL" CELLPADDING="4" CELLBORDER="0" CELLSPACING="0"><TR><TD>注解</TD></TR></TABLE>>];
// predefined [shape="plain" label=<<TABLE CELLBORDER="1" CELLPADDING="4" CELLSPACING="0" BORDER="0"><TR><TD></TD><TD>已定义流程</TD><TD></TD></TR></TABLE>>];
// onpage [shape="circle" label="同页参考"];
// offpage [shape="invhouse" label="换页参考"];
// db [shape="cylinder" label="数据档或资料库"];
// init [shape="hexagon" label="初始化"];
// rankdir = "LR";
start [shape="none" label=<<TABLE BORDER="1" CELLPADDING="4" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0"><TR><TD>电灯不工作了</TD></TR></TABLE>>];
decision_1 [shape="diamond" label="电灯接好了么?"];
comment_1 [shape="none" margin=0 label=<<TABLE BORDER="1" SIDES="TBL" CELLPADDING="4" CELLBORDER="0" CELLSPACING="0"><TR><TD>some comments...</TD></TR></TABLE>>]; // 位置决定其渲染顺序
end_1 [shape="none" label=<<TABLE BORDER="1" CELLPADDING="4" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0"><TR><TD>接好电源</TD></TR></TABLE>>];
decision_2 [shape="diamond" label="灯泡烧毁了么?"];
end_2 [shape="none" label=<<TABLE BORDER="1" CELLPADDING="4" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0"><TR><TD>更换灯泡</TD></TR></TABLE>>];
end_3 [shape="none" label=<<TABLE BORDER="1" CELLPADDING="4" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0"><TR><TD>修理电灯</TD></TR></TABLE>>];
start -> decision_1;
decision_1 -> comment_1 [style="dashed" arrowhead="none"];
decision_1 -> end_1 [label="否"];
decision_1 -> decision_2 [label="是"];
decision_2 -> end_2 [label="否"];
decision_2 -> end_3 [label="是"];
}
dot -Kdot flowchart_demo.dot -Tpng -o flowchart-demo.png
[3]