JUNG (grafico Java): come impedire la sovrapposizione di etichette per vertici e bordi?

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

  •  07-07-2019
  •  | 
  •  

Domanda

Attualmente sto usando Jung per disegnare grafici (intendo davvero grafici non grafici!). Il problema è che le etichette dei vertici e dei bordi si sovrappongono ai vertici e ai bordi. Questo porta a grafici dall'aspetto strano. Il problema non è associato a un algoritmo di layout specifico (sebbene abbia utilizzato FRLayout).

Esistono delle possibilità per dire a JUNG di prevenire queste sovrapposizioni? Speravo che questo fosse già implementato e l'unico problema è trovare le giuste opzioni!

È stato utile?

Soluzione

(La seguente risposta presuppone Jung2; non ho familiarità con pre-Jung2).

Uno dei punti di forza di Jung è che è molto estensibile e facilmente ampliabile. Jung consente di collegare vari trasformatori (proprietà di rendering semplici), renderer (rendering più complesso) e così via, per personalizzare il comportamento quando l'impostazione predefinita non è corretta. Questi sono generalmente installati su RenderContext (che puoi ottenere da VisualizationViewer).

Il rovescio della medaglia, i suoi svantaggi sono la sua complessità e la mancanza di una documentazione decente. Se eseguirai personalizzazioni da moderate a pesanti, dovrai scavare nella fonte Jung.

Ad esempio, il rendering dell'etichetta vertice può essere personalizzato collegando un nuovo renderizzatore di etichette vertici (interfaccia Renderer.VertexLabel). Ad esempio, è possibile creare un'istanza di BasicVertexLabelRenderer e specificare una posizione diversa (nord, ovest, centro, ecc.). Potresti mettere la tua etichetta al centro, se sei disposto a cambiare la forma in qualcosa di più grande di quel cerchio (per farlo, installa il tuo trasformatore di forma del vertice - un'istanza di Transformer). In alternativa, è possibile creare un'implementazione personalizzata di questa interfaccia che rende uno sfondo sotto il testo dell'etichetta.

Puoi anche installare la tua versione ottimizzata di Renderer.EdgeLabel (vedi BasicEdgeLabelRenderer di Jung) per personalizzare il posizionamento dell'etichetta del bordo.

Altri suggerimenti

Devi solo impostare l'offset dell'etichetta:

vv.getRenderContext().setLabelOffset(20);

Dove vv è l'oggetto VisualizationViewer .

a proposito, se vuoi cambiare il colore, all'inizio sembra essere un grande dolore. ma di recente ho scoperto questo piccolo trucco:

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);

Penso che questo sia il modo in cui è stato implementato, gli autori del codice probabilmente non lo vedono come un problema. La libreria JUNG è open source, quindi puoi apportare modifiche a tuo piacimento.

Se non si desidera modificare il codice, una soluzione semplice per rendere le etichette più leggibili sarebbe semplicemente cambiare il colore delle etichette, quindi differiscono dai bordi.

Ho riscontrato lo stesso problema delle etichette Edge sovrapposte. Una soluzione rapida e sporca che ho usato per posizionare le etichette dei bordi è riempiendo una certa lunghezza con spazi bianchi nel valore della stringa.

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

Eviterà che le etichette dei bordi si appannino e si sovrappongano al centro soprattutto quando si crea un grafico bipartito. Spero che questo aiuti alcuni di voi là fuori!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top