2012-07-09 2 views
3

프로젝트에 정을 사용하려고하고 일부 테스트 데이터로 시작하길 원하는 모양/동작을 얻으려고합니다.Jung, 큰 정점을위한 레이아웃이 겹치고 그래프가 이상한 위치에 나타납니다.

아이디어는 Verticies 모양 상단에 레이블이있는 매우 큰 Vertices를 갖는 것입니다. 그래프의 데이터는 런타임에 생성되므로 정적 레이아웃을 수행 할 수 없습니다.

그래프를 배치하여 Vertices가 겹치지 않지만 레이블이 내부에 들어갈 수 있도록 충분히 커야합니다 (실제 레이블의 길이는 20-30 자보다 긴 문자열). 나는 SpringLayout을 사용하여 시도했지만 노드가 여전히 겹치지 만, 레이아웃은 계속 흔들 리기 쉽다 (성가시다).

또한 Repulsion 곱셈기를 증가시키면서 FRLayout을 시도했지만, 숫자가 충분히 커지면 Vertices가 겹치는 원을 만듭니다.

마우스 제스처를 사용하여 확대하면 노드가 분리 된 것처럼 보이고 원하는대로 가까이 볼 수 있습니다. 어쩌면 해결책은 초기화시 확대하는 것입니다. 정확하게 수행하는 방법과 노드 수에 따라 줌의 정도를 결정하는 방법은 확실하지 않습니다.

일반적으로 내 데이터에는 노드 수가 적습니다 (50 미만, 일반적으로 10 미만). 그러나 그것은 데이터 구동 방식이므로 이러한 크기를 완벽하게 제어 할 수는 없습니다.

마지막으로 그래프가 나타나면 부분적으로 화면에서 사라집니다. 이상적으로는 볼 수있는 영역의 왼쪽 상단 부분을 향해 렌더링됩니다. 그걸 통제 할 방법이 있니?

다음은 내가 의미하는 바를 잘 보여주기 위해 사용하는 샘플 클래스입니다 (릴리스 용으로 다듬어 짐). 봄 레이아웃의 봄 레이아웃 Overlapping Verticies with Spring Layout

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

중복 Verticies 노드 간격에 대한 Zoom in of Spring Layout appears better

+0

직접 해결책을 찾았습니까? 나는 해결책에서 흥미 롭다, 나는 동일한 문제를 만난다. – Zangdak

+0

아니요. 문제를 해결하기 전에 프로젝트 작업을 중단해야했습니다. 궁금한 점이 있으시면 솔루션을 찾으십시오. – Jim

답변

2

잘 나타납니다 결정에 도움이 될 것입니다 setForceMultiplier 및 setRepulsionRange가 얼마나 멀리 떨어져 노드가 그려집니다. "흔들림"을 제거하려면 layout.lock (true)을 사용하여 원하는 위치에 노드를 유지합니다.