Design do Prefuse

 

No artigo anterior, aprendemos como construir uma aplicação simples utilizando o prefuse, no entanto recebi vários emails de leitores pedindo mais informações sobre como construir suas próprias visualizações. Então este artigo irá tratar sobre o design do Prefuse, não nos iremos nos prender a código, mas entender o motivo de usar cada etapa de uma visualização.

 

Etapas para o desenvolvimento de uma visualização

O prefuse possui o design baseado no modelo de referência de visualização de informações, de forma que o processo de visualização é quebrado em etapas discretas. Essas etapas variam desde a aquisição e modelagem dos dados até a visualização interativa. Para qualquer visualização do prefuse, é preciso seguir essas etapas: coleta de dados(i), visualização(ii), ações(iii) e controles(iv).


sfdprefusefig01.jpg 

Figura 1 – Design do prefuse, disponível em http://prefuse.org/doc/manual/introduction/structure/

 

Primeira etapa

A primeira etapa para a criação de uma visualização consiste na coleta dos dados para a tabela de  visualização (Table, Graph, Tree). Esses dados podem ser de diversas fontes (prefuse.data.io) inclusive do  banco de dados. Sendo que os dados podem ser tabela de figuras, grafos de redes sociais, árvores, etc.

 

Essa primeira etapa consiste na extração dos dados (arquivos) gerados para a tabela de dados(o modelo de grafo, ou árvore) que o prefuse entende. No exemplo do artigo passado utilizamos um arquivo graphml que utiliza a linguagem XML para representação de grafos, no entanto esses dados podem ser também árvores(treeml) ou tabelas(csv).



sfdprefusefig02.jpg

 

Segunda etapa

A segunda etapa consiste na construção da visualização que mapeia os dados para a abstração visual (processo visual, renderização, interação). Cada elemento pode ter vários VisualItems  correspondentes, que representam um objeto interativo na tela. Cada VisualItem contem propriedades como posição (x,y), cor, forma e tamanho.



sfdprefusefig03.jpg

Terceira etapa

A terceira etapa consiste na construção de uma série de ações de  processamento de dados(Actions) que operam sobre  a abstração visual. Essas instâncias de Action podem ser agrupadas em ActionLists  para várias tarefas de processamento.



sfdprefusefig04.jpg


Alguns leitores tiveram dificuldade em entender para que serviam todos esses argumentos no DataColorAction, então vamos gastar um pouco mais de tempo com ele:

 

DataColorAction

·         o nome do grupo de dados a ser processado(No nosso caso serão os nodos)

·         o nome do atributo que será a base para as cores(No nosso caso gender)

·         o tipo de dado do campo: nominal, ordinal, numerical.

·         a forma da cor do campo

o    stroke – é utilizado para desenhar linhas ou bordas, se quisermos que o nossos nodos sejam vazados, devemos preencher com stroke, no nosso caso, preferimos que fossem sólidos, por isso usamos o fill.

o    fill – é utilizado para preencher, no caso, os os nossos tiveram a aparência de sólidos, ou seja “pintados” por dentro.

o    Text – é utilizado para texto.

·         Paleta de cores (opcional)

 

Quarta etapa

A quarta etapa consiste na especificação da forma que itens visuais serão desenhados  na tela. Para ver formas abstratas, rótulos de texto ou  imagens, é necessário construir um RendererFactory. O RendererFactory  mapeia os itens visuais para a instância de Renderer. O Renderer  é responsável pelo desenho de itens visuais na tela. Para ver texto nos nodos, precisa-se criar um LabelRenderer e no nosso caso que queremos que o nome contido na tag name seja escrito no nodo, precisamos passar o  valor de "name" nos nós. A Visualization contém uma instância de DefaultRendererFactory, que desenha linhas para  arestas por padrão.



sfdprefusefig05.jpg

 

Última etapa

Falta apenas adicionar os controles sobre a visualização. No caso, os Displays suportam várias transformações, tais como panning e zooming , para manipular os itens visuais. Interatividade pode ser aplicada usando controles pré-construídos (prefuse.controls).

 

O presufe também da suporte a buscas ricas e filtros. Vários engines de busca (prefuse.data.search) e  queries dinâmicas(prefuse.data.query) estão  disponíveis.

 

Notem que ao contrário do exemplo no artigo anterior, agora foi adicionado um outro controle, o NeighborHighlightControl. Esse controle permite que ao focalizarmos um nodo com o mouse, os vizinhos sejam destacados. Volte até a terceira etapa e vejam que foram adicionadas duas novas linhas, tratam-se exatamente das cores desse novo controle. Quando passamos o argumento VisualItem.FIXED, dizemos que quando mouse focalizar aquele nodo, ou seja, quando estiver fixo, deverá possuir a cor passada logo depois. Quando passamos o argumento VisualItem.HIGHLIGH, declaramos a cor dos nodos vizinhos que estão ligados ao nodo fixo pelo mouse.


sfdprefusefig06.jpg

 

Pacotes

 

sfdprefusefig07.jpg


Figura 2 – Pacotes do prefuse, disponível em http://prefuse.org/doc/manual/introduction/structure/

 

Pacote prefuse.data – Esse pacote providencia uma estrutura de dados de Table, Graph, e Tree. No caso, as linhas da tabela são representadas pela classe Tuple. O prefuse também providencia uma linguagem de expressão interpretada para escrita de queries nas estruturas de dados do prefuse, essas classes de expressões estão no pacote prefuse.data.expression.

 

Pacote prefuse.data.io – Esse  pacote providencia classes para leitura e escrita de dados tabela, grafo e árvore para  arquivos formatados. Para tabelas, são suportados arquivos CSV (comma-separated-values). Para estrutura de redes, são suportados os formatos de arquivos GraphML e  TreeML baseados em XML.

 

O pacote prefuse.data.io.sql providencia facilidades para consultas SQL.

 

Pacote prefuse.control – Esse pacote permite adicionar controles a aplicação, como os controles de zoom, panning, drag, etc.

 

Pacote prefuse.action – Permite  criar os actions para a visualização.

 

Pacote prefuse.renderer – Permite criar os renderers.

 

Acredito que quem olhou o primeiro artigo possa ter tido um melhor entendimento do design do prefuse, e saber quais processos necessários para criar a própria visualização,

obrigado,

 

Samuel Félix