JUNG (Java Graph): как предотвратить наложение меток вершин и ребер? - PullRequest
6 голосов
/ 14 сентября 2009

В настоящее время я использую Юнг для рисования графиков (я действительно имею в виду графики, а не диаграммы!) Проблема в том, что метки вершин и ребер пересекаются с вершинами и краями. Это приводит к странно выглядящим графикам. Проблема не связана с определенным алгоритмом размещения (хотя я использовал FRLayout).

Есть ли какие-либо возможности сказать JUNG, чтобы предотвратить эти перекрытия? Я надеялся, что это уже реализовано, и единственная проблема - найти правильные варианты!

Ответы [ 5 ]

7 голосов
/ 03 декабря 2010

Вам просто нужно установить смещение метки:

vv.getRenderContext().setLabelOffset(20);

Где vv - ваш VisualizationViewer объект.

6 голосов
/ 07 января 2010

кстати, если вы хотите изменить цвет, на первый взгляд это кажется большой болью. но я недавно обнаружил этот маленький трюк:

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);
5 голосов
/ 14 октября 2009

(следующий ответ предполагает Jung2; я не знаком с pre-Jung2).

Одной из сильных сторон Юнга является то, что он очень расширяемый и легко расширяемый. Jung позволяет вам подключать различные преобразователи (простые свойства рендеринга), средства рендеринга (более сложный рендеринг) и т. Д., Чтобы настроить поведение, когда значение по умолчанию не совсем правильно. Обычно они устанавливаются в RenderContext (который вы можете получить из вашего VisualizationViewer).

С другой стороны, его недостатками являются сложность и отсутствие достойной документации. Если вы собираетесь выполнить какую-либо настройку от умеренной до тяжелой, вам нужно покопаться в источнике Юнга.

Например, рендеринг меток вершин можно настроить, подключив новый рендерер меток вершин (интерфейс Renderer.VertexLabel). Например, вы можете создать экземпляр BasicVertexLabelRenderer и указать другую позицию (север, запад, центр и т. Д.). Вы можете поместить свою метку в центр, если вы хотите изменить форму на нечто большее, чем этот круг (для этого установите свой собственный преобразователь формы вершины - экземпляр Transformer). Кроме того, вы можете создать свою собственную реализацию этого интерфейса, которая отображает фон под текстом метки.

Вы также можете установить собственную модифицированную версию Renderer.EdgeLabel (см. Jung's BasicEdgeLabelRenderer), чтобы настроить расположение метки края.

2 голосов
/ 14 сентября 2009

Я думаю, что именно так оно и реализовано, авторы кода, вероятно, не видят в этом проблемы. Библиотека JUNG имеет открытый исходный код, поэтому вы можете вносить в нее изменения по своему усмотрению.

Если вы не хотите изменять код, проще всего сделать ярлыки более читабельными, просто изменив цвет ярлыков, чтобы они отличались от краев.

1 голос
/ 28 апреля 2014

Я столкнулся с той же проблемой перекрывающихся меток ребер. Быстрое и грязное решение, которое я использовал для размещения меток ребер, заключается в заполнении определенной длины пробелами в строковом значении.

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

Это позволит избежать помутнения и наложения краевых меток в центре, особенно при построении двудольного графа. Надеюсь, это поможет некоторым из вас!

...