Na DOT
linguagem para GraphViz
, estou tentando representar um diagrama de dependência. Eu preciso ter nós dentro de um contêiner e poder tornar nós e / ou contêineres dependentes de outros nós e / ou contêineres.
Estou usando subgraph
para representar meus contêineres. A vinculação de nó funciona muito bem, mas não consigo descobrir como conectar subgráficos.
Dado o programa abaixo, preciso conectar-me cluster_1
e cluster_2
com uma seta, mas qualquer coisa que tentei cria novos nós em vez de conectar os clusters:
digraph G {
graph [fontsize=10 fontname="Verdana"];
node [shape=record fontsize=10 fontname="Verdana"];
subgraph cluster_0 {
node [style=filled];
"Item 1" "Item 2";
label = "Container A";
color=blue;
}
subgraph cluster_1 {
node [style=filled];
"Item 3" "Item 4";
label = "Container B";
color=blue;
}
subgraph cluster_2 {
node [style=filled];
"Item 5" "Item 6";
label = "Container C";
color=blue;
}
// Renders fine
"Item 1" -> "Item 2";
"Item 2" -> "Item 3";
// Both of these create new nodes
cluster_1 -> cluster_2;
"Container A" -> "Container C";
}
fdp
. O exemplo vinculado e o acima de ambos funcionam (a última linha do exemplo aqui precisa usar os nomes dos subgráficos e não o rótulo e pode ser bom incluir comprimentos de linha no gráfico); está um pouco apertado como está).fdp
v2.28.0 e copiando / colando a fonte do exemplo, as linhas se conectam ao centro do subgráfico, não às bordas. Se você abrir o .dot em OmniGraffle estão conectados corretamente, enquantoneato
edot
tanto criar nós supérfluos para o cluster.Respostas:
O manual do usuário do DOT fornece o seguinte exemplo de gráfico com clusters com arestas entre clusters:
... e arestas entre nós e clusters:
fonte
DUMMY_0 [shape=point style=invis]
Para facilitar a referência, a solução descrita na resposta do HighPerformanceMark, aplicada diretamente à pergunta original, tem a seguinte aparência:
O
compound=true
nagraph
declaração é vital. Isso produz saída:Observe que eu alterei as arestas para referenciar os nós no cluster, adicionei os atributos ltail e lhead a cada borda, especificando o nome do cluster e adicionei o atributo no nível do gráfico 'composite = true'.
Com relação à preocupação de que alguém possa querer conectar um cluster sem nós, minha solução foi sempre adicionar um nó a cada cluster, renderizado com style = plaintext. Use esse nó para rotular o cluster (em vez do atributo "label" interno do cluster, que deve ser definido como a sequência vazia (em Python
label='""'
). Isso significa que não estou mais adicionando arestas que conectam clusters diretamente, mas funciona na minha situação particular.fonte
cluster_0 -> cluster_1
presente como você produz . Porque pode haver muitos itens no cluster_0 vinculados a outros itens no cluster_1 (muitos para muitos ou um para muitos). Seria bom apenas ligar dois.Verifique se você está usando o
fdp
layout do arquivo. Eu não acho queneato
suporta clusters.fonte
neato
motor não suporta clusters .. Eu não tenho certeza se este é um bug ou não ..