JUNG (Java Graph): ¿Cómo evitar que las etiquetas Vertex y Edge se superpongan?

StackOverflow https://stackoverflow.com/questions/1422665

  •  07-07-2019
  •  | 
  •  

Pregunta

Actualmente estoy usando Jung para dibujar gráficos (¡realmente quiero decir gráficos, no cuadros!). El problema es que las etiquetas de vértice y borde se superponen con los vértices y los bordes. Esto lleva a gráficos de aspecto extraño. El problema no está vinculado a un Algoritmo de diseño específico (aunque he estado usando FRLayout).

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

¿Fue útil?

Solución

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

Una de las fortalezas de Jung es que es muy extensible y fácil de extender. Jung le permite conectar varios transformadores (propiedades de representación simples), representadores (representación más compleja), etc., para personalizar el comportamiento cuando el valor predeterminado no es del todo correcto. Por lo general, se instalan en el RenderContext (que puede obtener de su VisualizationViewer).

Por otro lado, sus inconvenientes son su complejidad y la falta de documentación decente. Si va a realizar una personalización de moderada a fuerte, deberá profundizar en la fuente de Jung.

Por ejemplo, la representación de la etiqueta de vértice se puede personalizar conectando un nuevo renderizador de etiqueta de vértice (interfaz Renderer.VertexLabel). Por ejemplo, puede crear una instancia de BasicVertexLabelRenderer y especificar una posición diferente (norte, oeste, centro, etc.). Puede poner su etiqueta en el centro, si está dispuesto a cambiar la forma a algo más grande que ese círculo (para hacerlo, instale su propio transformador de forma de vértice, una instancia de Transformador). Alternativamente, puede crear su propia implementación personalizada de esta interfaz que representa un fondo debajo del texto de la etiqueta.

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

Otros consejos

Solo necesita establecer el desplazamiento de la etiqueta:

vv.getRenderContext().setLabelOffset(20);

Donde vv es su objeto VisualizationViewer .

por cierto, si quieres cambiar el color, al principio parece ser un gran dolor. pero recientemente descubrí 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);

Creo que así es como se implementó, los autores del código probablemente no lo vean como un problema. La biblioteca JUNG es de código abierto, por lo que puede hacer cambios a su gusto.

Si no desea cambiar el código, una solución fácil para hacer que las etiquetas sean más legibles sería simplemente cambiar el color de las etiquetas, para que difieran de los bordes.

He encontrado el mismo problema de etiquetas de borde superpuestas. Una solución rápida y sucia que utilicé para colocar 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);

Evitará que las etiquetas de los bordes se nublen y se superpongan en el centro, especialmente al construir un gráfico bipartito. ¡Espero que esto ayude a algunos de ustedes!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top