DOT 语言是 Graphviz 中用于描述图形结构的语言,它非常简洁并且富有表达力。Graphviz 是一个开源图形可视化工具,可以通过 DOT 文件来生成不同类型的图形,比如流程图、思维导图、状态机图、依赖图等。

下面是 DOT 语言的详细语法和一些常用特性。


1. 图的类型

在 DOT 语言中,你可以创建两种类型的图:

  • 有向图 (digraph):箭头标明了节点之间的方向。
  • 无向图 (graph):节点之间的连接没有方向。
digraph G {  // 有向图
  A -> B;    // 从 A 到 B
}

graph G {    // 无向图
  A -- B;    // A 和 B 是无方向连接
}

2. 节点和边

在 DOT 文件中,图形的主要构件是节点(nodes)和边(edges)。节点和边都可以有不同的属性来控制它们的样式、颜色、形状等。

节点 (Node)

每个节点可以有以下属性:

  • label:节点的标签,显示在节点内。
  • shape:节点的形状,常见的有 ellipse(椭圆形)、rectangle(矩形)、circlediamond 等。
  • color:节点的边框颜色。
  • fillcolor:节点的填充颜色(与 style=filled 一起使用)。
  • style:节点的样式(filleddotteddashed 等)。
  • fontname:节点标签的字体。
  • fontsize:节点标签的字体大小。

定义节点

node1 [label="节点1", shape=circle, style=filled, fillcolor=lightblue];
node2 [label="节点2", shape=rectangle, color=black];

边 (Edge)

边的属性可以定义:

  • label:边的标签。
  • color:边的颜色。
  • style:边的样式(例如 dasheddotted)。
  • arrowhead:箭头的类型(例如 normalnone)。

定义边

node1 -> node2 [label="连接", color=red, style=dashed];
node2 -- node3 [label="无向连接", color=blue];

3. 图的全局属性

图和节点、边的属性是可以全局设置的。通过设置图的全局属性,可以统一管理图的外观。

设置图属性

graph [bgcolor="lightyellow"];    // 图的背景颜色(无向图)
digraph [bgcolor="lightblue"];    // 图的背景颜色(有向图)

node [shape=ellipse, style=filled, fontname="Arial", fontsize=12];   // 设置节点属性
edge [color=green, fontname="Helvetica"];   // 设置边的属性

4. 子图(Subgraph)

子图允许你组织节点、边,并对这些节点和边应用共同的属性。子图可以用于控制节点的布局、方向等,常用于指定同一组节点的布局。

digraph G {
  // 定义子图,且子图的名字必须以 "cluster_" 开头来生成一个边框
  subgraph cluster_0 {
    // 设置子图内部的节点样式
    node [style=filled, color=lightgrey];
    
    // 定义节点
    A;
    B;
    
    // 设置子图的标签
    label="子图 1";
  }
  
  // 定义子图外部的连接
  A -> B;
}

subgraph 会生成一个子图,cluster_0 会自动生成一个边框,并且带有标签“子图 1”。

5. 图布局

  • rankdir:控制图的布局方向。
    • LR:从左到右(默认是从上到下)。
    • TB:从上到下。
    • BT:从下到上。
    • RL:从右到左。
digraph G {
  rankdir=LR;   // 使图从左到右布局
  A -> B;
  B -> C;
}

6. 常见形状和样式

  • 节点形状shape):

    • ellipse:椭圆形(默认)
    • rectangle:矩形
    • diamond:菱形
    • circle:圆形
    • plaintext:没有框架的文本(类似标签)
    • box:带边框的矩形
    • parallelogram:平行四边形
    • star:星形
  • 节点样式style):

    • solid:实线(默认)
    • dotted:虚线
    • dashed:虚线
    • filled:填充(需要设置 fillcolor
    • invis:不可见(隐藏节点)
  • 边的箭头类型arrowhead):

    • normal:常规箭头(默认)
    • none:没有箭头
    • inv:反向箭头
    • dot:点状箭头
    • odot:圆点箭头
    • vee:V形箭头

7. 其他常用属性

  • 颜色

    • colorfillcolor:支持标准颜色(如 redbluelightgreen)和十六进制颜色(如 #FF0000)。
  • 字体

    • fontname:设置字体(如 ArialHelvetica)。
    • fontsize:设置字体大小。
  • 图形大小

    • size:设置图的大小,格式为 width,height(单位为英寸)。
    • ratio:控制图形的长宽比。

8. 实际例子

简单的有向图示例:

digraph G {
  // 设置图的背景颜色
  graph [bgcolor="lightgrey"];
  
  // 设置全局节点和边属性
  node [shape=circle, fontname="Arial", fontsize=14];
  edge [color="blue"];
  
  // 定义节点和边
  A -> B [label="边1"];
  B -> C [label="边2"];
  C -> A [label="边3"];
}

无向图的示例:

graph G {
  // 设置节点的形状为矩形
  node [shape=rectangle, style=filled, fillcolor=lightblue];
  
  // 无向连接
  A -- B [label="连接1"];
  B -- C [label="连接2"];
  A -- C [label="连接3"];
}

9. 高级布局技巧

  • 避免交叉边

    • 使用 rankdir 和 rank=same 来控制节点和边的位置,尽量避免交叉。
  • 使节点对齐

    • subgraph 可以帮助你将多个节点放在同一水平线或垂直线,使布局更加整齐。

10. 常见问题

  • 无效的 DOT 语法:确保语法正确,例如边的连接符号是 ->(有向边)或者 --(无向边)。
  • 未显示的节点:确保没有使用 invis 属性隐藏节点,或者在没有正确渲染的情况下使用了不支持的图形形状。

结语:

DOT 语言是一个功能强大且简洁的图形描述语言,广泛用于表示结构化数据。Graphviz 工具提供了多种布局算法和图形渲染方式,使得 DOT 语言的图形能够清晰、直观地展示复杂的关系。

 

2.进阶用法

在 DOT 语言的基本用法基础上,Graphviz 还支持一些高阶用法,可以帮助用户实现更复杂的图形可视化需求。下面我将列出 10 个高阶用法,展示如何通过 DOT 语言创建更加复杂和精细的图形。

1. 自定义图的布局方向 (rankdir)

通过 rankdir 属性,你可以控制图形的布局方向。默认情况下,DOT 图是从上到下排列的,可以通过设置 rankdir 改变为从左到右、从下到上或从右到左。

digraph G {
  rankdir=LR;   // 图形从左到右布局
  A -> B;
  B -> C;
  C -> D;
}

常用值:

  • LR:从左到右
  • TB:从上到下(默认)
  • BT:从下到上
  • RL:从右到左

2. 子图 (Subgraph) 和聚类 (Cluster)

使用 subgraph 和 cluster_ 前缀可以将节点分组,并为该组节点添加共同的属性。使用 cluster_ 可以自动添加边框。

digraph G {
  subgraph cluster_0 {
    node [style=filled, color=lightgrey];
    A;
    B;
    label="子图 1";
  }
  A -> B;
  B -> C;
}

3. 设置节点的形状和颜色

你可以根据需要为节点指定不同的形状、颜色、填充颜色、字体等属性。

graph G {
  node [shape=ellipse, color=blue, style=filled, fillcolor=lightyellow];
  A;
  B [shape=diamond, fillcolor=lightpink];
  A -- B;
}
  • shaperectangleellipsecirclediamondbox 等。
  • color:节点边框颜色。
  • fillcolor:节点填充颜色(必须与 style=filled 一起使用)。

4. 控制节点之间的对齐 (rank)

通过使用 rank 属性,可以控制同一层次的节点对齐。rank=same 确保多个节点在同一水平或垂直线上。

digraph G {
  A;
  B;
  C;
  { rank=same; A; B; }
  A -> C;
  B -> C;
}

这将使节点 A 和 B 在同一水平线上,C 节点位于下方。

5. 设置边的样式

边的样式不仅包括颜色,还包括虚线、点线、箭头样式等。

digraph G {
  edge [style=dashed, color=red];
  A -> B;
  B -> C;
  A -> C [style=solid, color=blue];
}

常见的 style 属性有:

  • solid:实线(默认)。
  • dashed:虚线。
  • dotted:点线。
  • invis:不可见。

6. 使用 constraint 属性控制边的优先级

通过 constraint 属性,可以控制图形中边的布局优先级。设置为 false 时,该边不会影响节点的布局。

digraph G {
  A;
  B;
  C;
  A -> B [constraint=false];  // 这条边不会影响布局
  B -> C;
}

在一些复杂布局中,constraint=false 可以让边不会影响节点的位置安排。

7. 节点和边的标签

你可以为节点和边添加标签,并设置标签的字体、大小、颜色等属性。

digraph G {
  node [fontname="Arial", fontsize=12];
  A [label="开始节点"];
  B [label="结束节点"];
  A -> B [label="连接边"];
}
  • label:设置节点或边的文本标签。
  • fontname:设置标签的字体。
  • fontsize:设置标签的字体大小。

8. 使用 tooltip 属性添加工具提示

你可以为节点或边添加工具提示,当鼠标悬停时,显示附加信息。

digraph G {
  A [label="节点A", tooltip="这是节点A"];
  B [label="节点B", tooltip="这是节点B"];
  A -> B;
}

tooltip 属性在可视化工具中(例如 Graphviz 的 HTML 渲染)会显示在用户悬停时。

9. 设置图的大小和边距

使用 size 和 margin 属性,可以控制图的总体大小以及节点与节点之间的边距。

digraph G {
  size="10,10";   // 设置图的大小
  margin=0.1;     // 设置边距
  A;
  B;
  A -> B;
}
  • size:设置图形的尺寸(单位是英寸)。
  • margin:设置节点和图形边缘之间的空白边距。

10. 使用 URL 和图形格式

DOT 语言允许你为节点和边设置 URL,在渲染时生成可点击的链接。你还可以设置图形的输出格式(如 PNG、SVG 等)。

digraph G {
  A [label="点击我", URL="http://example.com"];
  B [label="节点B", shape=rectangle];
  A -> B;
}
G A 点击我 B 节点B A->B

这个代码段会将节点 A 转换成一个可点击的链接,点击后打开 http://example.com


总结:

这些高阶用法展示了如何使用 DOT 语言实现复杂的布局和图形定制。通过合理运用节点、边的属性,结合图的全局设置,你可以创建符合需求的高度自定义的图形。 DOT 语言的强大之处在于它能够简洁地描述图形结构,并通过 Graphviz 渲染器生成高质量的可视化效果。这些高级用法不仅能够让你控制图的外观,还能为不同的应用场景提供更多灵活性。


问:制作一个工厂生产订单的流程图,使用DOT语言编写

答:当您要使用DOT语言创建工厂生产订单的流程图时,可以使用以下代码示例。这是一个简单的流程图,您可以根据需要进行修改和扩展。

digraph FactoryProduction {
  // 设置节点属性
  node [shape=rectangle, style=rounded];

  // 定义节点
  start [label="开始", shape=ellipse];
  receiveOrder [label="接收订单"];
  checkInventory [label="检查库存"];
  produceItems [label="生产商品"];
  qualityCheck [label="质量检查"];
  packItems [label="包装商品"];
  shipOrder [label="发货"];
  end [label="结束", shape=ellipse];

  // 定义边
  start -> receiveOrder;
  receiveOrder -> checkInventory;
  checkInventory -> produceItems [label="有库存"];
  checkInventory -> end [label="无库存"];
  produceItems -> qualityCheck;
  qualityCheck -> packItems [label="合格"];
  qualityCheck -> end [label="不合格"];
  packItems -> shipOrder;
  shipOrder -> end;
}
FactoryProduction start 开始 receiveOrder 接收订单 start->receiveOrder checkInventory 检查库存 receiveOrder->checkInventory produceItems 生产商品 checkInventory->produceItems 有库存 end 结束 checkInventory->end 无库存 qualityCheck 质量检查 produceItems->qualityCheck packItems 包装商品 qualityCheck->packItems 合格 qualityCheck->end 不合格 shipOrder 发货 packItems->shipOrder shipOrder->end

这个简单的流程图包括以下步骤:

  1. 开始
  2. 接收订单
  3. 检查库存
  4. 如果有库存,进行生产;如果无库存,结束
  5. 生产商品
  6. 质量检查
  7. 如果合格,进行包装;如果不合格,结束
  8. 包装商品
  9. 发货
  10. 结束

方法1:您可以根据实际情况修改节点和边的标签,以适应您工厂生产订单的具体流程。将以上DOT代码保存为文件(例如production_order.dot),然后使用Graphviz工具将其转换为图像文件(例如PNG格式):

dot -Tpng -o production_order.png production_order.dot

方法2:使用在线网站打开

请确保您已经安装了Graphviz工具。

以下是Graphviz Online的纯文本链接:https://dreampuf.github.io/GraphvizOnline/

您可以将此链接复制并粘贴到浏览器的地址栏中打开。

方法3:vscode打开

在Visual Studio Code(VSCode)中使用DOT语言绘制图形,您可以通过安装一个支持Graphviz的插件来实现。下面是您可以安装的插件之一,以及如何在VSCode中进行安装和使用的步骤:

安装Graphviz (dot) 插件:

  1. 打开VSCode。
  2. 转到侧边栏中的扩展(Extensions, 或者使用快捷键Ctrl+Shift+X)。
  3. 在扩展搜索栏中搜索“Graphviz”或者“dot”。
  4. 查找一个名为Graphviz Interactive Preview 或者“Graphviz (dot) language support for Visual Studio Code”或者类似的插件。
  5. 点击“安装”(Install)按钮以安装该插件。

使用Graphviz插件:

  1. 安装插件后创建一个新的文件,并将文件保存为.dot扩展名,例如example.dot
  2. 将您上面的DOT代码粘贴到这个文件中。
  3. 按照插件的说明进行操作,插件可能支持直接在VSCode中预览图形,或者可以将其导出为PNG, SVG等格式的图像。
  4. 如果插件支持预览,通常会有一个预览按钮或者一个命令可以在VSCode的命令面板中输入(可以通过Ctrl+Shift+P打开命令面板输入>graphviz preview类似的)以生成图形。

注意: 一些Graphviz插件可能需要您在系统上已安装Graphviz工具包。如果所需要,请确保按照插件的文档安装了所有必需的依赖项。

可以根据选择的插件的文档和指南来确保正确安装和使用。插件通常会提供详细的使用说明。