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

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

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


person Vilx-    schedule 27.06.2010    source источник


Ответы (3)


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

вот так:

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»; затем визуализируйте его в графическом представлении, вы увидите три различных типа краев по внешнему виду.

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

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

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

для меня стилизация узлов по группам аналогична практике HTML по определению класса и назначению его набору div в HTML-разметке.

person doug    schedule 28.06.2010
comment
Как мы можем установить стиль по умолчанию для подграфов? - person Pacerier; 16.07.2014
comment
Нет необходимости в подграфах. Все края, определенные ниже объявления стиля края с помощью края [color=...etc], будут использовать этот стиль. - person bousch; 19.08.2015

Хотя ответ @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 

результирующий график

person bukzor    schedule 18.03.2014
comment
Идеально, просто идеально. - person Pacerier; 17.07.2014
comment
Почему лучше? Не для того, чтобы критиковать вас. Я недостаточно знаю графвиз, чтобы понять, чем он лучше, и мне интересно это узнать. - person Leo Ufimtsev; 06.04.2015
comment
Мне просто нравится полученная диаграмма. Принцип решения не отличается. - person bukzor; 12.04.2015

как указано в подграфе @bousch, не требуется.

«Все ребра, определенные ниже объявления стиля ребра с «краем [цвет =... и т. д.]», будут использовать этот стиль».

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;
  
}

сделает то же, что и @bukzor.

person HugO    schedule 04.04.2019