JUNG (Java Graph): Comment éviter le chevauchement des étiquettes Vertex et Edge?

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

  •  07-07-2019
  •  | 
  •  

Question

J'utilise actuellement Jung pour dessiner des graphiques (ce que je veux vraiment dire, ce ne sont pas des graphiques!). Le problème est que les étiquettes de sommet et de bord se chevauchent avec les sommets et les bords. Cela conduit à des graphiques étranges. Le problème n'est pas lié à un algorithme de mise en page spécifique (bien que j'utilise FRLayout).

Existe-t-il des possibilités d’indiquer à JUNG d’empêcher ces chevauchements? J'espère que cela est déjà mis en œuvre et que le seul problème est de trouver les bonnes options!

Était-ce utile?

La solution

(La réponse suivante suppose Jung2; je ne connais pas bien la pré-Jung2).

L’un des points forts de Jung est qu’il est très extensible et facilement extensible. Jung vous permet de brancher divers transformateurs (propriétés de rendu simples), rendus (rendus plus complexes), etc., pour personnaliser le comportement lorsque la valeur par défaut n'est pas correcte. Celles-ci sont généralement installées sur le RenderContext (que vous pouvez obtenir à partir de VisualizationViewer).

D'un autre côté, ses inconvénients sont sa complexité et le manque de documentation décente. Si vous souhaitez effectuer une personnalisation allant de modérée à lourde, vous devrez vous pencher sur la source Jung.

Par exemple, le rendu d'étiquette de sommet peut être personnalisé en insérant un nouveau rendu d'étiquette de sommet (interface Renderer.VertexLabel). Par exemple, vous pouvez instancier BasicVertexLabelRenderer et spécifier une position différente (nord, ouest, centre, etc.). Vous pouvez mettre votre étiquette au centre si vous souhaitez modifier la forme en un élément plus grand que ce cercle (pour ce faire, installez votre propre transformateur de forme de sommet - une instance de Transformer). Vous pouvez également créer votre propre implémentation personnalisée de cette interface, qui restitue un arrière-plan sous le texte de l'étiquette.

Vous pouvez également installer votre propre version modifiée de Renderer.EdgeLabel (voir BasicEdgeLabelRenderer de Jung) pour personnaliser le positionnement de l'étiquette du bord.

Autres conseils

Il vous suffit de définir le décalage de l'étiquette:

vv.getRenderContext().setLabelOffset(20);

vv est votre objet VisualizationViewer .

Au fait, si vous voulez changer de couleur, au début, cela semble être une douleur majeure. mais j'ai récemment découvert ce petit truc:

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

Je pense que c’est justement ainsi que cela a été mis en œuvre. Les auteurs du code ne le voient probablement pas comme un problème. La bibliothèque JUNG est open-source, vous pouvez donc la modifier à votre guise.

Si vous ne souhaitez pas modifier le code, une solution simple pour rendre les étiquettes plus lisibles consiste simplement à changer la couleur des étiquettes afin qu'elles diffèrent des bords.

J'ai rencontré le même problème de chevauchement des étiquettes de bord. Une solution rapide et sale que j’utilisais pour positionner les étiquettes de bord consiste à ajouter une certaine longueur à des espaces blancs dans la valeur de la chaîne.

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

Cela évitera les étiquettes de bord de nuage et de chevauchement au centre, en particulier lors de la création d’un graphe bipartite. J'espère que cela aidera certains d'entre vous!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top