GraphViz 文件中具有相同属性的节点组

Groups of nodes with the same attributes in GraphViz file

我想用 GraphVizdot 语言描述一个二模网络。所以我有两种不同类型的节点。例如,一组可以包含人们如何阅读,另一组可以包含人们正在阅读的书籍。

我想给这两组中的节点以不同的外观(shapecolor 等)。如何在一条语句中为一组节点 指定属性。目的是能够在一个地方更改每组节点的外观,而不是在所有单个节点描述中。

这可以用属性继承之类的东西来完成,但我不知道dot语言是否有这个概念。

这可以针对具有 node 关键字的图中的所有节点或具有 edge 关键字的图中的所有边来完成。这也可以在逐个节点或逐个边的基础上完成。

整个图或子图的示例:

digraph
{
  subgraph readers
  {
      node[shape=box; color=red;]
      r1; r2; r3;
  }

  subgraph books
  {
      node[shape=circle; color=blue;]
      b1; b2; b3;
  }
  r1->{b1 b2}
  r2->{b2 b3}
  r3->{b1 b2 b3}
}

这会给你图表:

每个节点属性的示例:

digraph
{
    n1[shape=triangle];
    n2[shape=star];
    n3[shape=square];

    n1->n2->n3
}

会给出图表:

原则上有三种可能

  1. 在创建节点之前设置默认属性
    • 全局 - 适用于所有后续节点创建
    • 在子图中本地 - 仅对子图中的节点创建有效
  2. 创建具有显式属性的节点
  3. 创建后将属性分配给一组节点。

选项 1 和 2 只允许每个节点一个组,因为创建是一个事件。选项 3 允许对每个作业进行不同的分组。


在创建节点之前全局设置默认属性

digraph {
  x // node with current defaults

  // set default
  node [shape=box color=red]
  // create with default values
  a1, a2

  // set default
  node [shape=circle color=blue]
  // create with default values
  b1, b2

  y // node with current defaults

  x->{a1 a2}
  a1->{b1 b2}
  a2->{b1 b2}
  {b1,b2}->y
}


在创建节点之前在本地设置默认属性

digraph {
  x // node with current defaults

  {
      // set default
      node [shape=box color=red]
      // create with default values
      a1, a2
  }

  {
      // set default
      node [shape=circle color=blue]
      // create with default values
      b1, b2
  }

  y // node with current defaults

  x->{a1 a2}
  a1->{b1 b2}
  a2->{b1 b2}
  {b1,b2}->y
}


创建具有显式属性的节点

digraph {
  x // node with current defaults

  // create with explicit attributes
  a1, a2 [shape=box color=red]

  // create with explicit attributes
  b1, b2 [shape=circle color=blue]

  y // node with current defaults

  x->{a1 a2}
  a1->{b1 b2}
  a2->{b1 b2}
  {b1,b2}->y
}


创建后将属性分配给一组节点

digraph {
  x // node with current defaults

  // create with default values
  a1, a2, b1, b2

  // assign shape
  a1, a2 [shape=box]
  b1, b2 [shape=circle]

  // assign color
  a1, b2 [color=red]
  b1, a2 [color=blue]

  y // node with current defaults

  x->{a1 a2}
  a1->{b1 b2}
  a2->{b1 b2}
  {b1,b2}->y
}