Проблемы макета JUNG2: результирующие графики оказываются слишком широкими - PullRequest
0 голосов
/ 14 апреля 2011

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

  1. у некоторых узлов будет несколько родителей.Кроме того, эти родители могут находиться на разных ветвях дерева.
  2. некоторые узлы могут иметь дубликаты (это нужно разрешить, я не могу их просто игнорировать)

На данный момент я использую SparseGraph;поместите все узлы в графе, нарисуйте отношения sub / super с направленными и продублируйте как ненаправленные ребра между узлами.Затем, следуя исходному коду MinimumSpanningTreeDemo , я создаю объект MinimumSpanningTreeForest2 и отправляю Forest в TreeLayout.Короче говоря, я получаю макеты, однако они имеют ширину около 15000 пикселей!Поскольку я использую эти графики не в интерактивном режиме, а в качестве статических изображений, это просто невозможно в отчетах.

Я понял, что метки узлов занимают немного места, если слишком много узлов расположены рядом друг с другом, поэтому я решил, что я мог бы повернуть метки и вместо этого расположить их вертикально.Это с треском провалилось, мне удается вращать метки, используя собственный класс, который расширяет DefaultVertexLabelRenderer, но когда я устанавливаю вращение на Math.PI/2, то я просто не вижу меток!Итак, вот мои вопросы:

  1. Можно ли сделать макет более тонким?Я хотел бы сделать что-то вроде дендрограммы, которая, как утверждается, возможна с использованием JUNG2 .Это действительно возможно?В таком случае как?
  2. Есть ли в моем представлении промах, что должна быть возможность визуализировать метки узлов по вертикали?Я пытался изменить опорную точку в классе VertexLabelAsShapeRenderer, но все равно не испытывал радости.Говоря о материи;связь между Renderer s RendererContext и фактическими визуализированными объектами действительно нечеткая.Есть много классов, и мне трудно понять, какие из них на самом деле используются для рендеринга.Например, BasicVertexLabelRenderer кажется, что по умолчанию он вообще не используется.Таким образом, позиционирование ярлыков в целом просто мистическое ...

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

В любом случае;вот фрагмент моего кода, где создается график:

public void visualizeGraph(File saveFolder){

    MinimumSpanningForest2<PHGNode, PHGEdge> prim = new MinimumSpanningForest2<PHGNode, PHGEdge>(
            g,  new DelegateForest<PHGNode, PHGEdge>(), DelegateTree.<PHGNode, PHGEdge>getFactory(),
                new ConstantTransformer(1.0));

    Forest<PHGNode, PHGEdge> tree = prim.getForest();

    Layout<PHGNode, PHGEdge> layout = new TreeLayout<PHGNode, PHGEdge>(tree);
    // custom visualization viewer that allows writing to disk
    final WritingVisualizationViewer<PHGNode, PHGEdge> vv = new WritingVisualizationViewer<PHGNode, PHGEdge>(layout,layout.getSize());

    // this class extends VertexLabelAsShapeRenderer and supplies means of fiddling with label coordinates
    VerticalVertexLabelAsShapeRenderer<PHGNode,PHGEdge> vlasr = 
            new VerticalVertexLabelAsShapeRenderer<PHGNode,PHGEdge>(vv.getRenderContext()); 

    vv.getRenderContext().setVertexLabelTransformer(
            new ChainedTransformer<PHGNode,String>(new Transformer[]{
                    new ToStringLabeller<PHGEdge>(),new Transformer<String,String>() {
                            public String transform(String input) { return input;       }}})); 

    //  Change the background of node labels so that they appear transparent
    Transformer<PHGNode,Paint> vertexPaint = new Transformer<PHGNode,Paint>() {
        public Paint transform(PHGNode n) { return vv.getBackground();  }
    };

        // extends DefaultVertexLabelRendeder to provide rotation of labels
    VerticalVertexLabelRenderer vvlr = new VerticalVertexLabelRenderer();
    vv.getRenderContext().setVertexLabelRenderer(vvlr); 

    vv.getRenderContext().setVertexFontTransformer(new VertexFontTransformer<PathwayHierarchyGraph.PHGNode>()); 
    vv.getRenderContext().setVertexShapeTransformer(vlasr); 
    vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
    vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.BentLine<PHGNode, PHGEdge>()); 
    vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);


    //printGraphStats(tree);
    vv.writeToDisk(saveFolder,"hierarchyTree.png");


}

1 Ответ

1 голос
/ 17 апреля 2011

Чтобы ответить на ваши вопросы:

(1) У JUNG нет макета дендрограммы. Мне тоже было бы интересно узнать, что сделал комментатор по связанному вопросу, чтобы использовать JUNG для генерации дендрограммы. Однако вы можете указать, что такое x-разделение между братьями и сестрами (и каково y-разделение между родителями и детьми).

(2) Я не писал большую часть кода визуализации JUNG, поэтому мне пришлось бы в него углубиться. Я бы сказал, что в AFAIK нет прямой поддержки вращающихся меток вершин (я никогда не просил об этом) pi / 2 должен привести к сбою. Я бы посмотрел на след консоли, хотя; когда это происходит, почти наверняка возникают некоторые исключения.

В качестве практического решения вы можете попытаться визуализировать часть метки вершины и использовать текст при наведении, чтобы отобразить остальные.

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

...