我正在尝试使用Jung作为项目并获得外观/行为我希望我从一些测试数据开始。Jung,大顶点重叠的布局和图形出现在奇怪的位置
这个想法是在Verticies形状上有标签的非常大的顶点。图形的数据将在运行时生成,所以我不能做静态布局。
如何布局图形,使顶点不重叠,但仍足够大,以便标签可以放在里面(真正的标签将有更长的字符串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);}
}
}
重叠Verticies同春布局
放大春天布局似乎更好
你有没有找到自己的解决方案?我在解决方案中很有趣,我遇到了同样的问题。 – Zangdak 2014-04-29 14:53:59
不能在我解决这个问题之前不得不停止在项目上工作。如果您找到解决方案,请在此发布,因为我很好奇! – Jim 2014-04-29 18:56:36