1001Ferramentas
🔗Geradores

Gerador de Graph DOT (Graphviz)

Gera código DOT (Graphviz) a partir de uma lista de arestas. Suporta digrafo (->) e grafo (--). Pronto para colar em viz.js.


  

DOT e Graphviz: desenho declarativo de grafos para engenheiros

DOT é a linguagem de descrição de grafos usada pelo Graphviz, o toolkit open-source de visualização nascido no AT&T Bell Labs em 1991 (liderado por Stephen North). A ideia é simples e poderosa: você descreve o grafo num pequeno arquivo de texto — nós, arestas, atributos — e deixa um motor de layout automático calcular as coordenadas, sem precisar arrastar caixas. Três décadas depois, o DOT continua sendo o formato que compiladores, gerenciadores de pacote, profilers e artigos acadêmicos usam quando precisam de uma renderização determinística.

Este gerador emite DOT válido que pode ser colado em dot, neato, fdp, circo, twopi ou em qualquer visualizador web (Graphviz Online, edotor.net, viz-js no navegador). Abaixo está a referência completa: graph vs digraph, atributos, formas, motores de layout, clusters, labels HTML e armadilhas comuns.

Tipos de grafo e sintaxe básica

O DOT distingue dois tipos de grafo no topo:

  • graph — não direcionado. Arestas usam --. Exemplo: A -- B.
  • digraph — direcionado. Arestas usam ->. Exemplo: A -> B.
  • Prefixo strict (strict digraph G { ... }) — proíbe arestas duplicadas entre o mesmo par de nós.
digraph G {
  A -> B;
  B -> C;
  A -> C;
}

Atributos: nó, aresta, grafo

Atributos vivem entre colchetes e se aplicam a um nó, uma aresta ou ao grafo inteiro:

digraph G {
  rankdir=LR;                         // grafo: layout esquerda-direita
  node [shape=box, style=rounded];    // padrão de todos os nós
  edge [color=gray, fontsize=10];     // padrão de todas as arestas

  A [label="Início", color=red];
  B [shape=diamond, label="Decisão?"];
  C [label="Fim"];

  A -> B [label="vai"];
  B -> C [label="sim", style=dashed];
}
  • Nível grafo: rankdir (TB, LR, BT, RL), bgcolor, splines (line | ortho | curved), ranksep, nodesep, label (título), concentrate=true (junta arestas paralelas).
  • : shape, label, color, fillcolor + style=filled, fontname, width, height, tooltip, URL (clicável em SVG).
  • Aresta: label, color, style (solid | dashed | dotted | bold), arrowhead (normal | vee | dot | none), weight (dica para o layout), constraint=false (não influencia ranks).

Formas de nó

O Graphviz traz dezenas de formas; as mais úteis são:

  • box, ellipse, circle, diamond, plaintext, point, none.
  • polygon com sides=6, orientation=30, distortion, skew.
  • record e Mrecord (arredondado) — caixas subdivididas: A [shape=record, label="{ nome | idade | email }"].
  • folder, note, tab, cylinder para diagramas de sistemas.

Motores de layout

O Graphviz traz vários binários, cada um implementando um algoritmo de layout. Escolher o motor certo importa mais do que ajustar atributos:

  • dot — hierárquico (estilo Sugiyama) para grafos direcionados com fluxo claro. Padrão e ideal para DAGs, dependências, call graphs, FSMs.
  • neato — modelo spring/Kamada-Kawai para grafos não direcionados pequenos.
  • fdp — force-directed placement para grafos não direcionados maiores.
  • sfdpfdp multinível para grafos muito grandes (milhares de nós).
  • circo — layout circular; bom para estruturas cíclicas.
  • twopi — layout radial em torno de um nó raiz escolhido.
dot   -Tpng entrada.dot -o saida.png
dot   -Tsvg entrada.dot -o saida.svg
neato -Tpdf entrada.dot -o saida.pdf
sfdp  -Tsvg -Goverlap=prism enorme.dot -o saida.svg

Clusters e labels HTML

Clusters agrupam nós relacionados dentro de uma caixa rotulada. O nome do subgrafo precisa começar com cluster_:

digraph G {
  subgraph cluster_frontend {
    label="Frontend";
    style=filled; fillcolor=lightgray;
    web; mobile;
  }
  subgraph cluster_backend {
    label="Backend";
    api; db;
  }
  web -> api;
  mobile -> api;
  api -> db;
}

Labels HTML permitem incorporar tabelas, fontes e cores dentro de um nó — perfeito para caixas estilo ER:

Usuario [shape=plaintext, label=<
  <TABLE BORDER="1" CELLBORDER="1">
    <TR><TD COLSPAN="2"><B>Usuario</B></TD></TR>
    <TR><TD>id</TD><TD>PK</TD></TR>
    <TR><TD>email</TD><TD>unique</TD></TR>
  </TABLE>
>];

Usos no mundo real

  • Grafo de dependências: npm ls --graph, cabal-plan dot, bazel query --output=graph.
  • Internals de compilador: opt -dot-cfg do LLVM produz control-flow graphs.
  • Profilers: gprof2dot, pprof -dot, alternativa ao flame graph via perf script.
  • Máquinas de estado finito: várias DSLs (xstate, statecharts) exportam DOT.
  • Topologias de rede, organogramas, árvores genealógicas, mapas conceituais acadêmicos.

Alternativas

  • Mermaid — mais novo (2014), nativo em JavaScript, renderiza em Markdown, GitHub, Notion.
  • D2 — linguagem moderna (2022) com sintaxe mais amigável e temas embutidos.
  • PlantUML — abrange mais (UML, ER, sequência) e usa Graphviz por baixo para vários tipos de diagrama.
  • Gephi — app desktop interativo para grafos muito grandes (milhões de arestas).

FAQ

Por que meu grafo fica embolado com centenas de nós? O motor padrão dot é otimizado para DAGs pequenos. Para grafos densos use sfdp com -Goverlap=prism -Gsplines=true, ou quebre em clusters para o layout resolver cada parte separadamente.

Posso renderizar o mesmo DOT em vertical e horizontal? Sim — defina rankdir=TB (padrão) ou rankdir=LR como atributo do grafo. Pode sobrescrever na linha de comando com -Grankdir=LR.

Existe editor visual para DOT? O Graphviz é orientado a texto. Para edição interativa há Gephi (para grafos analíticos grandes), yEd ou edotor.net. Para colaboração, versione o DOT em Git e deixe o CI renderizar.

Por que minhas arestas cruzam os rótulos dos nós? Aumente nodesep e ranksep, defina splines=ortho ou splines=curved, ou troque para fdp/neato se o grafo for não direcionado.

Posso colocar nós em dois clusters diferentes? Um nó pertence a exatamente um cluster. Use arestas invisíveis (style=invis) ou restrições de rank ({rank=same; A; B}) para influenciar o layout sem mudar a posse.

Ferramentas Relacionadas