2009-09-14 19 views
6

Actualmente estoy usando Jung para dibujar gráficos (realmente me refiero a los gráficos no gráficos!). El problema es que las etiquetas Vertex y Edge se superponen con los vértices y los bordes. Esto lleva a extraños gráficos de aspecto. El problema no está vinculado a un algoritmo de diseño específico (aunque he estado usando FRLayout).JUNG (Gráfico de Java): ¿Cómo evitar que se superpongan las etiquetas Vertex y Edge?

¿Hay alguna posibilidad de decirle a JUNG que evite estas superposiciones? ¡Espero que esto ya esté implementado y el único problema es encontrar las opciones correctas!

Respuesta

5

(La siguiente respuesta asume Jung2; no estoy familiarizado con pre-Jung2).

Uno de los puntos fuertes de Jung es que es muy extensible y fácil de extender. Jung le permite conectar varios transformadores (propiedades de representación simples), renderizadores (representación más compleja), y así sucesivamente, para personalizar el comportamiento cuando el valor predeterminado no es del todo correcto. Estos generalmente se instalan en RenderContext (que puede obtener de VisualizationViewer).

Por otro lado, sus inconvenientes son su complejidad y la falta de documentación decente. Si vas a hacer cualquier personalización de moderada a pesada, necesitarás profundizar en la fuente de Jung.

Por ejemplo, la representación de etiqueta de vértice se puede personalizar insertando un nuevo procesador de etiqueta de vértice (interfaz Renderer.VertexLabel). Por ejemplo, puede instanciar BasicVertexLabelRenderer y especificar una posición diferente (norte, oeste, centro, etc.). Podrías poner tu etiqueta en el centro, si estás dispuesto a cambiar la forma en algo más grande que ese círculo (para hacerlo, instala tu propio transformador de forma de vértice, una instancia de Transformer). De forma alternativa, podría crear su propia implementación personalizada de esta interfaz que represente un fondo debajo del texto de la etiqueta.

También podría instalar su propia versión ajustada de Renderer.EdgeLabel (consulte el BasicEdgeLabelRenderer de Jung) para personalizar el posicionamiento de la etiqueta de borde.

2

Creo que así es como se implementó, los autores del código probablemente no lo vean como un problema. La biblioteca de JUNG es de código abierto, por lo que le invitamos a realizar los cambios que considere oportunos.

Si no desea cambiar el código, una solución sencilla para que las etiquetas sean más legibles sería simplemente cambiar el color de las etiquetas, por lo que difieren de los bordes.

6

por cierto, si desea cambiar el color, al principio parece ser un gran dolor. pero recientemente he descubierto este pequeño truco:

Transformer labelTransformer = new ChainedTransformer<String,String>(new Transformer[]{ 
      new ToStringLabeller<String>(), 
      new Transformer<String,String>() { 
      public String transform(String input) { 
       return "<html><font color=\"yellow\">"+input; 
      }}}); 

context.setVertexLabelTransformer(labelTransformer); 
+3

¿Sabe dónde está documentado este uso de HTML en JUNG. En otras palabras, ¿cuáles son las posibilidades y cuáles son las limitaciones del uso de HTML en JUNG? – madewael

7

Sólo tiene que establecer el desplazamiento de etiqueta:

vv.getRenderContext().setLabelOffset(20); 

Dónde vv es su VisualizationViewer objeto.

1

He encontrado el mismo problema que las etiquetas de borde superpuestas. Una solución rápida y sucia que utilicé para ubicar las etiquetas de borde es rellenando una cierta longitud con espacios en blanco en el valor de la cadena.

//pad some white spaces to value of edge when adding edges to the graph 
graph.addEdge(String.format("%-35s", "Edge-A"), 1, 2); 

Se evitará las etiquetas de borde de nublado y solapada en el centro, especialmente cuando la construcción de un gráfico bipartito. Espero que esto ayude a algunos de ustedes por ahí!

Cuestiones relacionadas