使用 Graphviz 绘制流程图

流程图常用符号及对应的无样式 dot 语句[1]

形状 描述 DOT
Flowline (Arrowhead) 用来表达过程的次序,用一条线由一个符号连接去到另一个符号。如果不是标准的上至下、左至右图就会加上箭头 ->
Terminal 用来表示次要或程式的开始与完结。常以一个圆角长方形表示。通常里面会标上“开始”或“结束”或其他相关字眼,如“提交查询”或“接受产品” terminal [shape="plain" label=<<TABLE BORDER="1" CELLPADDING="4" STYLE="ROUNDED" CELLBORDER="0" CELLSPACING="0"><TR><TD>起止符号</TD></TR></TABLE>>];
Process 以长方形来代表一系列程序去改变数值、形式、数据的位置 process [shape="rectangle" label="程序"];
Decision 以一个菱形去显示一个条件进程,用来按情况去决定下一步走向。通常以“是/否”或“真/假”值去决定 decision [shape="diamond" label="决策判断"];
Input/Output 以平行四边形来标示数据输入或输出的过程,即填入数据或显示工作结果的步骤 io [shape="parallelogram" label="输入/输出"];
Annotation (Comment) 用来补充某步骤的额外资讯,可用一个虚线来连接一个半闭合的长方型至想注释的符号中 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"];
Predefined Process 用一个有2条左右垂直线长方型,来表示一个已在其他地方定义了的过程 predefined [shape="plain" label=<<TABLE CELLBORDER="1" CELLPADDING="4" CELLSPACING="0" BORDER="0"><TR><TD></TD><TD>已定义流程</TD><TD></TD></TR></TABLE>>];
On-page Connector 用一个含有字母的小圆圈来连接目标流程画于同一页上 onpage [shape="circle" label="同页参考"];
Off-page Connector 用一个倒画的屋型来表示目标流程画于另一页上 offpage [shape="invhouse" label="换页参考"];
Data File or Database 用一个圆柱来表示数据库 db [shape="cylinder" label="数据档或资料库"];
Preparation or Initialization 用一个拉长了的六角形来代表初始化或预备的过程 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]

flowchart-demo


  1. 流程图 ↩︎

  2. The DOT Language ↩︎

  3. Command-line Invocation ↩︎

posted @ 2020-08-07 13:53  ayuuuuuu  阅读(1146)  评论(0编辑  收藏  举报