Como gerar grafos no formato .dot usando JGraphT

grafoA linguagem DOT é uma linguagem para descrição de grafos interpretada pelo GraphViz e também pelo Gephi para visualização de grafos. A biblioteca JGraphT dispõe de classes para exportação de grafos para este formato.

O código abaixo em Java, cria um grafo aleatório e exporta para um arquivo .dot. A figura ao lado mostra o grafo com dez vértices gerado a partir do código de exemplo, como o programa gera grafos aleatórios, outras execuções podem resultar em grafos diferentes.

import java.io.*;
import java.util.*;
import org.jgrapht.*;

//Gera um grafo aleatório G(n,p)
public class GeradorGrafoAlearorio {

    int n;
    double p;

    public GeradorGrafoAlearorio(int n, double p) {
        this.n = n;
        this.p = p;
    }

    public Graph<Object, DefaultEdge> gerarGrafoAleatorio() {
        Graph<Object, DefaultEdge> g = new SimpleGraph<>(DefaultEdge.class);
        for (int i = 0; i < n; i++) {
            g.addVertex(i);
        }

        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (Math.random() < p) {
                    g.addEdge(i, j);
                }
            }
        }
        return g;
    }

    static public void exportarGrafo(Graph<Object, DefaultEdge> g) {
        IntegerNameProvider<Object> nome = new IntegerNameProvider<Object>();
        DOTExporter<Object, DefaultEdge> exporta;
        exporta = new DOTExporter<Object, DefaultEdge>(nome, null, null, null, null);
        try {
            exporta.export(new FileWriter("grafo.dot"), g);
            System.out.println("Arquivo grafo.dot gerado");
        } catch (IOException e) {
        }
    }
    
    public static void main(String[] args) {
        Graph<Object, DefaultEdge> g;
        g = new SimpleGraph<>(DefaultEdge.class);

        GeradorGrafoAlearorio gerador;
        gerador = new GeradorGrafoAlearorio(10, 0.4);

        g = gerador.gerarGrafoAleatorio();

        exportarGrafo(g);
    }
}

Referências: http://stackoverflow.com/questions/16998608/jgrapht-export-to-dot-file

2 comentários sobre “Como gerar grafos no formato .dot usando JGraphT

  1. RAFAEL ALEXANDRE disse:

    Boa noite Renato,

    primeiramente gostaria de dar os parabéns pelo post. Estou começando a trabalhar com a biblioteca jgrapht e tenho algumas dúvidas. Talvez você possa me ajudar em uma delas. Abaixo descrevo a dúvida.

    Exportei um grafo utilizando o DOTExporter e funcionou perfeitamente. A diferença é que o meu vértice é um objeto que possui uma série de atributos. Tudo perfeito. Entretanto agora preciso de importar este mesmo grafo salvo em arquivo utilizando o DOTImporter e não estou conseguindo. Você possui algum exemplo didático que possa me auxiliar? Abaixo deixo o grafo exportado para o arquivo.

    digraph G {
    1 [ label=”47″ shape=”ID=47,StudentNumber=10,Latitude=20,Longitude=30″ ];
    2 [ label=”28″ shape=”ID=28,StudentNumber=11,Latitude=21,Longitude=31″ ];
    3 [ label=”29″ shape=”ID=29,StudentNumber=12,Latitude=22,Longitude=32″ ];
    4 [ label=”26″ shape=”ID=26,StudentNumber=13,Latitude=23,Longitude=33″ ];
    5 [ label=”79″ shape=”ID=79,StudentNumber=14,Latitude=24,Longitude=34″ ];
    1 -> 2 [ label=”(47 : 28)” weight=”5.0″ ];
    2 -> 3 [ label=”(28 : 29)” weight=”3.0″ ];
    4 -> 2 [ label=”(26 : 28)” weight=”6.0″ ];
    2 -> 4 [ label=”(28 : 26)” weight=”2.0″ ];
    5 -> 4 [ label=”(79 : 26)” weight=”4.0″ ];
    2 -> 5 [ label=”(28 : 79)” weight=”9.0″ ];
    4 -> 1 [ label=”(26 : 47)” weight=”7.0″ ];
    3 -> 2 [ label=”(29 : 28)” weight=”2.0″ ];
    1 -> 3 [ label=”(47 : 29)” weight=”10.0″ ];
    3 -> 5 [ label=”(29 : 79)” weight=”1.0″ ];
    }

    • Bom dia, Rafael

      Tentei fazer um exemplo de como se usa o DOTImporter do JGraphT, segue o código do exemplo completo, neste, ao invés de um arquivo, o grafo está em uma string:

      public class ReadGraph {
      
      public static DOTImporter<String, DefaultEdge> buildImporter() {
          VertexProvider<String> vp = new VertexProvider<String>() {
              @Override
              public String buildVertex(String label, Map<String, String> attributes) {
                  return label;
              }
          };
      
          EdgeProvider<String, DefaultEdge> ep = new EdgeProvider<String, DefaultEdge>() {
              public DefaultEdge buildEdge(String from, String to, String label, Map<String, String> attributes) {
                  return new DefaultEdge();
              }
          };
          return new DOTImporter<String, DefaultEdge>(vp,ep);
      
      }
      
      public static Multigraph<String, DefaultEdge> importar(){
          String input = "graph G {\n"
                       + "  1 [ \"label\"=\"abc123\" ];\n" 
                       + "  2 [ label=\"fred\" ];\n" 
                       + "  1 -- 2;\n"
                       + "}";
          DOTImporter<String, DefaultEdge> importer = buildImporter();
      
          Multigraph<String, DefaultEdge> result = new Multigraph<String, DefaultEdge>(DefaultEdge.class);
          try {
              importer.read(input, result);
          } catch (ImportException e) {
              e.printStackTrace();
          }
      
          return result;
      }
      
      public static void main(String[] args) {
          Multigraph<String, DefaultEdge> grafo;
          grafo = importar();
      
          Set<String> vSet = grafo.vertexSet();
          for (String v : vSet) {
              System.out.println(v+" ");
          }
      }
      }

      Observação: O DOTImporter só existe na versão 0.9.2 do JGraphT. Se quiser mais detalhes sobre este código, fique a vontade para perguntar.
      Talvez eu faça um post sobre isso.

Deixe uma resposta para Renato Melo Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s