Dot Source Code Blocks in Org Mode

1 简介

DotGraphviz 开源图形可视化软件中的六个布局程序之一,由 AT&T 创建。 Graphviz 布局程序采用简单的文本图形描述并以各种格式制作有用的图表。 Dot 代码块默认调用 dot 布局程序,但可以配置为调用任何其他五个 Graphviz 布局程序。

图形可视化在很多技术领域都有应用,它常常用于探索大型数据集。 Org 模式中的典型用法是将点源代码块链接到另一种语言的源代码块,该代码块负责将数据表转换为其中一种 Graphviz 布局语言的源代码。

2 配置

(org-babel-do-load-languages
 'org-babel-load-languages
 '((dot . t))) ; this line activates dot

3 使用示例

a Hello
b World
(mapcar #'(lambda (x)
	    (princ (format "%s [label =\"%s\", shape = \"box\"];\n"
			   (first x) (second x)))) table)
(princ (format "%s -> %s;\n" (first (first table)) (first (second table))))
a [label ="Hello", shape = "box"];
b [label ="World", shape = "box"];
a -> b;
digraph {
 $input
}

test-dot.png

digraph G {
    main -> parse -> execute;
    main -> init;
    main -> cleanup;
    execute -> make_string;
    execute -> printf
    init -> make_string;
    main -> printf;
    execute -> compare;
}

func-call.png

digraph G {
    size ="4,4";
    main [shape=box];   /* this is a comment */
    main -> parse [weight=8];
    parse -> execute;
    main -> init [style=dotted];
    main -> cleanup;
    execute -> { make_string; printf}
    init -> make_string;
    edge [color=red];   // so is this
    main -> printf [style=bold,label="100 times"];
    make_string [label="make a\nstring"];
    node [shape=box,style=filled,color=".7 .3 1.0"];
    execute -> compare;
}

fancy-func-call.png

digraph G {
     a -> b -> c;
     b -> d;
     a [shape=polygon,sides=5,peripheries=3,color=lightblue,style=filled];
     c [shape=polygon,sides=4,skew=.4,label="hello world"]
     d [shape=invtriangle];
     e [shape=polygon,sides=4,distortion=.7];
}

shape-polygon.png

digraph structs {
node [shape=record];
     struct1 [shape=record,label="<f0> left|<f1> mid\ dle|<f2> right"];
     struct2 [shape=record,label="<f0> one|<f1> two"];
     struct3 [shape=record,label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
     struct1 -> struct2;
     struct1 -> struct3;
}

shape-record.png

digraph html {
      abc [shape=none, margin=0, label=<
  <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
  <TR><TD ROWSPAN="3"><FONT COLOR="red">hello</FONT><BR/>world</TD>
      <TD COLSPAN="3">b</TD>
      <TD ROWSPAN="3" BGCOLOR="lightgrey">g</TD>
      <TD ROWSPAN="3">h</TD>
  </TR>
  <TR><TD>c</TD>
      <TD PORT="here">d</TD>
      <TD>e</TD>
  </TR>
  <TR><TD COLSPAN="3">f</TD>
  </TR>
  </TABLE>>];
}

label-html.png

digraph g {
    node [shape = record,height=.1];
    node0[label = "<f0> |<f1> G|<f2> "];
    node1[label = "<f0> |<f1> E|<f2> "];
    node2[label = "<f0> |<f1> B|<f2> "];
    node3[label = "<f0> |<f1> F|<f2> "];
    node4[label = "<f0> |<f1> R|<f2> "];
    node5[label = "<f0> |<f1> H|<f2> "];
    node6[label = "<f0> |<f1> Y|<f2> "];
    node7[label = "<f0> |<f1> A|<f2> "];
    node8[label = "<f0> |<f1> C|<f2> "];
    "node0":f2 -> "node4":f1;
    "node0":f0 -> "node1":f1;
    "node1":f0 -> "node2":f1;
    "node1":f2 -> "node3":f1;
    "node2":f2 -> "node8":f1;
    "node2":f0 -> "node7":f1;
    "node4":f2 -> "node6":f1;
    "node4":f0 -> "node5":f1;
}

node-ports.png

digraph structs {
     node [shape=record];
     struct1 [shape=record,label="<f0> left|<f1> middle|<f2> right"];
     struct2 [shape=record,label="<f0> one|<f1> two"];
     struct3 [shape=record,label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
     struct1:f1 -> struct2:f0;
     struct1:f2 -> struct3:here;
}

node-ports-struct.png

digraph G {
    nodesep=.05;
    rankdir=LR;
    node [shape=record,width=.1,height=.1];

    node0 [label = "<f0> |<f1> |<f2> |<f3> |<f4> |<f5> |<f6> | ",height=2.5];
    node [width = 1.5];
    node1 [label = "{<n> n14 | 719 |<p> }"];
    node2 [label = "{<n> a1  | 805 |<p> }"];
    node3 [label = "{<n> i9  | 718 |<p> }"];
    node4 [label = "{<n> e5  | 989 |<p> }"];
    node5 [label = "{<n> t20 | 959 |<p> }"];
    node6 [label = "{<n> o15 | 794 |<p> }"];
    node7 [label = "{<n> s19 | 659 |<p> }"];

    node0:f0 -> node1:n;
    node0:f1 -> node2:n;
    node0:f2 -> node3:n;
    node0:f5 -> node4:n;
    node0:f6 -> node5:n;
    node2:p -> node6:n;
    node4:p -> node7:n;
}

node-ports-hash.png

digraph G {
  subgraph cluster0 {
    node [style=filled,color=white];
    style=filled;
    color=lightgrey;
    a0 -> a1 -> a2 ->a3;
    label = "process #1";
  }

  subgraph cluster1 {
    node [style=filled];
    b0 -> b1 -> b2 ->b3;
    label = "process #1";
    color=blue;
  }

  start -> a0;
  start -> b0;
  a1 -> b3;
  b2 -> a3;
  a3 -> a0;
  a3 -> end;
  b3 -> end;

  start [shape=Mdiamond];
  end [shape=Msquare];
}

cluster.png

digraph G {
  size="8,6"; ratio=fill; node[fontsize=24];

  ciafan->computefan; fan->increment; computefan->fan; stringdup->fatal;
  main->exit; main->interp_err; main->ciafan; main->fatal; main->malloc;
  main->strcpy; main->getopt; main->init_index; main->strlen; fan->fatal;
  fan->ref; fan->interp_err; ciafan->def; fan->free; computefan->stdprintf;
  computefan->get_sym_fields; fan->exit; fan->malloc; increment->strcmp;
  computefan->malloc; fan->stdsprintf; fan->strlen; computefan->strcmp;
  computefan->realloc; computefan->strlen; debug->sfprintf; debug->strcat;
  stringdup->malloc; fatal->sfprintf; stringdup->strcpy; stringdup->strlen;
  fatal->exit;

  subgraph "cluster_error.h" { label="error.h"; interp_err; }

  subgraph "cluster_sfio.h" { label="sfio.h"; sfprintf; }

  subgraph "cluster_ciafan.c" { label="ciafan.c"; ciafan; computefan; increment; }

  subgraph "cluster_util.c" { label="util.c"; stringdup; fatal; debug; }

  subgraph "cluster_query.h" { label="query.h"; ref; def; }

  subgraph "cluster_field.h" { get_sym_fields; }

  subgraph "cluster_stdio.h" { label="stdio.h"; stdprintf; stdsprintf; }

  subgraph "cluster_<libc.a>" { getopt; }

  subgraph "cluster_stdlib.h" { label="stdlib.h"; exit; malloc; free; realloc; }

  subgraph "cluster_main.c" { main; }

  subgraph "cluster_index.h" { init_index; }

  subgraph "cluster_string.h" { label="string.h"; strcpy; strlen; strcmp; strcat; }
}

call-graph-with-labeled-cluster.png

digraph G {
  compound = true;
  subgraph cluster0 {
    a -> b;
    a -> c;
    b -> d;
    c -> d;
  }
  subgraph cluster1 {
    e -> g;
    e -> f;
  }
  b -> f [lhead=cluster1];
  d -> e;
  c -> g [ltail=cluster0,
	  lhead=cluster1];
  c -> e [ltail=cluster0];
  d -> h;
}

graph-with-edges-cluster.png

digraph world {
  size="7,7";
  {rank=same; S8 S24 S1 S35 S30;}
  {rank=same; T8 T24 T1 T35 T30;}
  {rank=same; 43 37 36 10 2;}
  {rank=same; 25 9 38 40 13 17 12 18;}
  {rank=same; 26 42 11 3 33 19 39 14 16;}
  {rank=same; 4 31 34 21 41 28 20;}
  {rank=same; 27 5 22 32 29 15;}
  {rank=same; 6 23;}
  {rank=same; 7;}

  S8 -> 9;
  S24 -> 25;
  S24 -> 27;
  S1 -> 2;
  S1 -> 10;
  S35 -> 43;
  S35 -> 36;
  S30 -> 31;
  S30 -> 33;
  9 -> 42;
  9 -> T1;
  25 -> T1;
  25 -> 26;
  27 -> T24;
  2 -> {3 ; 16 ; 17 ; T1 ; 18}
  10 -> { 11 ; 14 ; T1 ; 13; 12;}
  31 -> T1;
  31 -> 32;
  33 -> T30;
  33 -> 34;
  42 -> 4;
  26 -> 4;
  3 -> 4;
  16 -> 15;
  17 -> 19;
  18 -> 29;
  11 -> 4;
  14 -> 15;
  37 -> {39 ; 41 ; 38 ; 40;}
  13 -> 19;
  12 -> 29;
  43 -> 38;
  43 -> 40;
  36 -> 19;
  32 -> 23;
  34 -> 29;
  39 -> 15;
  41 -> 29;
  38 -> 4;
  40 -> 19;
  4 -> 5;
  19 -> {21 ; 20 ; 28;}
  5 -> {6 ; T35 ; 23;}
  21 -> 22;
  20 -> 15;
  28 -> 29;
  6 -> 7;
  15 -> T1;
  22 -> T35;
  22 -> 23;
  29 -> T30;
  7 -> T8;
  23 -> T24;
  23 -> T1;
}

graph-with-edges-cluster.png

digraph G {
  size="8,6"; ratio=fill; node[fontsize=24];
  a0 -> a1; a0 -> a2; a1 -> a3; a2 -> a3; a2 -> a4; a3 -> a5; a4 -> a5;

  subgraph "cluster0" {
     label="scb_0";
     a0; a3; a1; a2;
  }

  subgraph "cluster1" {
     label="scb_1";
     a4;
  }

  subgraph "cluster2" {
     label="scb_2";
     a5;
  }

}
[[https://brantou.github.io/images/ob-dot-intro/graph-with-scb.png]]
Last Updated 2018-04-26 Thu 18:43.
Render by hexo-renderer-org with Emacs 25.3.2 (Org mode 8.2.10)