2010-06-27 8 views
21

У меня есть график, который я хочу, чтобы graphviz был макет и визуализировал для меня. График имеет 122 ребра и 123 узла. Края имеют 4 разных типа, и я хочу, чтобы они были визуально различимыми. Однако я еще не решил, каким будет лучший способ сделать это, я бы немного поиграл с циферблатами. К сожалению, я не вижу ничего подобного атрибуту «class» или «stylesheet» для ребер. Я могу устанавливать визуальные атрибуты только для каждого края (много повторений). Может, я что-то пропустил? Может быть, есть какой-то способ добавить края к 4 различным группам, а затем стилизовать группы, а не каждый ребро отдельно?Graphviz: как назначить один и тот же стиль группе ребер?

ответ

30

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

так:

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 и т. Д.) - то есть эти ребра не привязаны к подграфу.

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

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

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

+0

Как мы можем установить стиль по умолчанию для подграфов? – Pacerier

+1

Нет необходимости в подграфах. Все ребра, определенные ниже объявлением стиля края с помощью «edge [color = ... etc]», будут использовать этот стиль. – Bousch

12

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

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

+1

Идеально, просто отлично. – Pacerier

+1

Почему это лучше? Не значит критиковать вас. Я не знаю, что такое graphviz, чтобы понять, как это лучше, и мне интересно узнать. –

+0

Мне просто нравится результирующая диаграмма. Принцип решения не отличается. – bukzor

Смежные вопросы