Я уже некоторое время работаю над JUNG2, пытаясь визуализировать довольно сложную иерархию набора объектов.К сожалению, эта иерархия на самом деле не похожа на дерево в том смысле, что:
- у некоторых узлов будет несколько родителей.Кроме того, эти родители могут находиться на разных ветвях дерева.
- некоторые узлы могут иметь дубликаты (это нужно разрешить, я не могу их просто игнорировать)
На данный момент я использую SparseGraph
;поместите все узлы в графе, нарисуйте отношения sub / super с направленными и продублируйте как ненаправленные ребра между узлами.Затем, следуя исходному коду MinimumSpanningTreeDemo , я создаю объект MinimumSpanningTreeForest2
и отправляю Forest
в TreeLayout
.Короче говоря, я получаю макеты, однако они имеют ширину около 15000 пикселей!Поскольку я использую эти графики не в интерактивном режиме, а в качестве статических изображений, это просто невозможно в отчетах.
Я понял, что метки узлов занимают немного места, если слишком много узлов расположены рядом друг с другом, поэтому я решил, что я мог бы повернуть метки и вместо этого расположить их вертикально.Это с треском провалилось, мне удается вращать метки, используя собственный класс, который расширяет DefaultVertexLabelRenderer
, но когда я устанавливаю вращение на Math.PI/2
, то я просто не вижу меток!Итак, вот мои вопросы:
- Можно ли сделать макет более тонким?Я хотел бы сделать что-то вроде дендрограммы, которая, как утверждается, возможна с использованием JUNG2 .Это действительно возможно?В таком случае как?
- Есть ли в моем представлении промах, что должна быть возможность визуализировать метки узлов по вертикали?Я пытался изменить опорную точку в классе
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");
}