JUNG (Java Graph): как предотвратить наложение меток вершин и ребер?
Вопрос
В настоящее время я использую Юнга для рисования графиков (я действительно имею в виду графики, а не диаграммы!). Проблема в том, что метки вершин и ребер пересекаются с вершинами и краями. Это приводит к странно выглядящим графикам. Проблема не связана с определенным алгоритмом размещения (хотя я использовал 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);
Это позволит избежать помутнения и наложения краевых меток в центре, особенно при построении двудольного графа. Надеюсь, это поможет некоторым из вас!