2015-03-04 3 views
4

На языке dotGraphViz Я хочу описать двухрежимную сеть. Поэтому у меня есть узлы двух разных типов. Например, одна группа может содержать людей, которые читают, а другая группа может содержать книги, которые читают люди.Группы узлов с теми же атрибутами в файле GraphViz

Я хочу дать узлам в этих двух группах разные взгляды (shape, color и т. Д.). Как указать атрибуты для группы узлов в одном сообщении. Цель состоит в том, чтобы иметь возможность изменять внешний вид каждой группы узлов в одном месте, а не во всех описаниях отдельных узлов.

Это может быть сделано с чем-то вроде атрибутом inheritance, но я не знаю, имеет ли этот язык dot.

ответ

4

В принципе, есть три возможности

  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 
} 

enter image description here


набор по умолчанию локально перед созданием узла

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 
} 

enter image description here


создавать узлы с явными признаками

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 
} 

enter image description here


правопреемником атрибуты к группе узлов после создания

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 
} 

enter image description here

+1

Вау, это очень полно. Благодаря! – halloleo

1

Это может быть сделано для всех узлов в графе с ключевым словом 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} 
} 

Это даст вам график:

enter image description here

Пример на атрибуты узла:

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

    n1->n2->n3 
} 

Даст график:

enter image description here

+0

Большое спасибо. Концепция «подграфа» была той, в которой я был. – halloleo