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.

Comentar

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 )

Imagem do Twitter

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

Foto do Facebook

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

Foto do Google+

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

Conectando a %s