3

プロジェクトに Jung を使用しようとしていますが、必要な外観/動作を取得するために、いくつかのテストデータから始めています。

アイデアは、Verticies 形状の上にラベルを付けた非常に大きな Vertices を持つことです。グラフのデータは実行時に生成されるため、静的レイアウトはできません。

頂点が重ならないようにグラフをレイアウトする方法はありますが、ラベルが内側に収まるように十分な大きさがあります (実際のラベルには 20 ~ 30 文字の長い文字列があります)。SpringLayout を使用してみましたが、ノードがまだオーバーラップしており、さらにレイアウトが揺れ続けています (これは面倒です)。

反発乗数を増やしながら FRLayout も試しましたが、数値が十分に大きくなると、頂点が重なり合った円が作成されます。

マウス ジェスチャを使用してズームインすると、ノードが分離しているように見え、目的に近いビューが得られます。そのため、解決策には初期化時のズームインが含まれる可能性がありますが、その方法と、ノードの数に依存する可能性があるため、ズームする量を決定する方法が正確にはわかりません。

通常、私のデータには少数のノードがあります (50 未満、より一般的には 10 未満)。ただし、データ駆動型であるため、これらのサイズを完全に制御することはできません。

最後に、グラフが表示されるときも、部分的に画面から外れています。理想的には、表示可能領域の左上部分に向かってレンダリングします。それを制御する方法はありますか?

以下は、私が何を意味するかをよりよく示すために使用しているサンプル クラスです (リリース用にトリミングされています)。

import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.util.TestGraphs;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.algorithms.layout.AbstractLayout;
import edu.uci.ics.jung.algorithms.layout.SpringLayout;
import edu.uci.ics.jung.visualization.GraphZoomScrollPane;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.decorators.AbstractVertexShapeTransformer;
import edu.uci.ics.jung.visualization.decorators.EdgeShape;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import java.awt.BorderLayout;
import java.awt.Color;
import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.functors.ConstantTransformer;
import edu.uci.ics.jung.visualization.picking.PickedState;
import edu.uci.ics.jung.visualization.renderers.DefaultVertexLabelRenderer;
import edu.uci.ics.jung.visualization.renderers.GradientVertexRenderer;
import edu.uci.ics.jung.visualization.renderers.VertexLabelAsShapeRenderer;
import java.awt.*;

    public class IDRelationshipGraphPanel extends javax.swing.JPanel
{
    private final VisualizationViewer<Integer,Number> vv;
    protected Transformer<Integer,String> vs;
    protected DefaultModalGraphMouse<Integer, Number> gm;
    protected AbstractLayout layout;
    protected VertexShapeSizeAspect<Integer,Number> vssa;

    public IDRelationshipGraphPanel()
    {

    Graph<? extends Object, ? extends Object> g = TestGraphs.getOneComponentGraph(); 

    layout = new SpringLayout( g) ;       
    vv= new VisualizationViewer<Integer,Number>(layout);
    GraphZoomScrollPane scrollPane = new GraphZoomScrollPane(vv);

    gm = new DefaultModalGraphMouse<Integer, Number>();
    vv.setGraphMouse(gm);                
    add(scrollPane, BorderLayout.CENTER);

    PickedState<Integer> picked_state = vv.getPickedVertexState();

    VertexLabelAsShapeRenderer<Integer, Number> vlasr = new VertexLabelAsShapeRenderer<Integer, Number>(vv.getRenderContext());

    vv.getRenderContext().setVertexShapeTransformer(vlasr);
    vv.getRenderContext().setVertexLabelRenderer(new DefaultVertexLabelRenderer(Color.red));
    vv.getRenderContext().setEdgeStrokeTransformer(new ConstantTransformer(new BasicStroke(2.5f)));

    // customize the renderer
    vv.getRenderer().setVertexRenderer(new GradientVertexRenderer<Integer, Number>( new Color(175,224,228), new Color(133,170,173), true));
    vv.getRenderer().setVertexLabelRenderer(vlasr);

    vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Integer>());
    vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<Integer, Number>());                            

    vssa = new VertexShapeSizeAspect<Integer,Number>();
    vv.getRenderContext().setVertexShapeTransformer(vssa);

    vv.getRenderContext().setArrowFillPaintTransformer(new ConstantTransformer(Color.lightGray));
    vv.getRenderContext().setArrowDrawPaintTransformer(new ConstantTransformer(Color.black));        
    }

    private final static class VertexShapeSizeAspect<V,E>
    extends AbstractVertexShapeTransformer <V>
    implements Transformer<V,Shape>  {

    public VertexShapeSizeAspect()
    {
        setSizeTransformer(new Transformer<V,Integer>()
                {
                    public Integer transform(V v) 
                    {
                    return 150;
                    }
                });
        setAspectRatioTransformer(new Transformer<V,Float>() 
                {
                    public Float transform(V v) 
                    {
                    return 1.0f;
                    }
                });                                                                
    }

    public Shape transform(V v){return factory.getEllipse(v);}
    } 
}

Spring Layout で頂点を重ねる Spring Layout で頂点を重ねる

Spring Layout の拡大表示が改善されました Spring Layout の拡大表示が改善されました

4

1 に答える 1