JUNG (Java Graph): как предотвратить наложение меток вершин и ребер?

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

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

vv.getRenderContext().setLabelOffset(20);

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top