Подтвердить что ты не робот

Как назначить один и тот же стиль группе ребер?

У меня есть график, который я хочу, чтобы Graphviz верстал и визуализировал для меня. Граф имеет 122 ребра и 123 узла. Края бывают 4 разных видов, и я хочу, чтобы они были визуально различимы. Однако я еще не решил, что будет лучшим способом сделать это, я хотел бы немного поиграть с циферблатами.

К сожалению, я не вижу ничего похожего на атрибут "class" или "stylesheet" для ребер. Я могу только установить визуальные атрибуты индивидуально для каждого края (много повторений). Возможно, я что-то пропустил? Может быть, есть какой-то способ добавить ребра в 4 разные группы, а затем стилизовать группы, а не каждое ребро отдельно?

4b9b3361

Ответ 1

Чтобы стиль ребер (или узлов) по группе, а не отдельно, используйте подграф.

так:

digraph G {

node [style=filled,color="#5D8AA8", fillcolor="#5D8AA8"];

subgraph c1 {
    edge [color="#004225", arrowsize="0.6", penwidth="1"];
    "node 1" -> "node 3";
    "node 5" -> "node 7";
    "node 1" -> "node 2"; 
    label = "";
}

subgraph c2 {
    edge [color="#FBEC5D", arrowsize="1.2", penwidth="3"];
    "node 2" -> "node 4";
    "node 4" -> "node 6";
    "node 3" -> "node 5";
    "node 6" -> "node 8"; 
    label = "";

}

begin -> "node 1";
start -> "node 2";
"node 1" -> "node 4"
"node 2" -> "node 6";

start [shape=diamond];}

Итак, если вы поместите код выше в файл с расширением ".dot"; затем визуализируйте его в graphviz, вы увидите три разные типы ребер, внешний вид.

Один тип - это только по умолчанию (цвет = черный, толщина = 1 и т.д.) - то есть эти ребра не назначаются подграфу.

Другие два типа ребер (тонкая, темно-зеленая группа и толстая ярко-желтая группа) стилизованы на основе присвоения одному из двух кластеров подграфов.

Подграф часто используется для визуального выделения кластера node (т.е. для выделения конкретной смежной "группы" узлов из остальных узлов на графике); однако, нет требования (как вы можете видеть из моего примера), что ребра, которые вы выбрали для стиля путем присвоения данному подграфу, относятся к смежной "группе" узлов - вы можете обозначить любые края, которые вы хотите присвоить, данный подграф.)

для меня, моделирование узлов по группам аналогично практике HTML определения класса и присвоения его коллекции divs в HTML-разметке

Ответ 2

В то время как ответ @doug правильный (используйте подграфы, чтобы присвоить подобный стиль группам объектов), я считаю, что мой пример лучше:

digraph G {                                                                     
  compound=true;
  subgraph columns {
    c0r0 -> c0r1;
    c0r1 -> c0r2;
    c1r0 -> c1r1;
    c1r1 -> c1r2;
    c2r0 -> c2r1;
    c2r1 -> c2r2;
  }
  subgraph rows {
    edge [color=red, constraint=false];
    c0r0 -> c1r0;
    c1r0 -> c2r0;
    c0r1 -> c1r1;
    c1r1 -> c2r1;
    c0r2 -> c1r2;
    c1r2 -> c2r2;
  }
}


cat square-digraph.dot | dot -Tsvg -o square-digraph.svg 

the resulting graph

Ответ 3

как указал @bousch, подграф не нужен.

"Все ребра, определенные под объявлением стиля ребра с помощью" edge [color =... etc] ", будут использовать этот стиль".

digraph G {                                                                     
  compound=true;
  
    c0r0 -> c0r1;
    c0r1 -> c0r2;
    c1r0 -> c1r1;
    c1r1 -> c1r2;
    c2r0 -> c2r1;
    c2r1 -> c2r2;
  
    edge [color=red, constraint=false];
    c0r0 -> c1r0;
    c1r0 -> c2r0;
    c0r1 -> c1r1;
    c1r1 -> c2r1;
    c0r2 -> c1r2;
    c1r2 -> c2r2;
  
}