我对可视化部分感到困惑,我创建了一个DirectedSparseMultiGraph,目的是可视化以下转换图。我希望以image.中所描述的相同方式绘制它。目前我正在this.
我知道问题在于布局,但我是JUNG框架的新手,我无法做到正确。
以下是我的代码段:
MyVertex 和 MyEdge 类是简单的类,其ID和相关的边缘概率都有一个字段。
package testing.jung.in.eclipse;
import java.awt.Dimension;
import javax.swing.JFrame;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.util.EdgeType;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position;
public class BasicGraphCreation
{
public static void main(String[] args)
{
Graph<MyVertex, MyEdge> g = new DirectedSparseMultigraph<MyVertex, MyEdge>();
MyVertex n0 = new MyVertex(0);
MyVertex n1 = new MyVertex(1);
MyVertex n2 = new MyVertex(2);
MyVertex n3 = new MyVertex(3);
MyVertex n4 = new MyVertex(4);
MyVertex n5 = new MyVertex(5);
MyVertex n6 = new MyVertex(6);
MyVertex o1 = new MyVertex(001);
MyVertex o2 = new MyVertex(010);
MyVertex o3 = new MyVertex(011);
MyVertex o4 = new MyVertex(100);
MyVertex o5 = new MyVertex(101);
MyVertex o6 = new MyVertex(110);
g.addEdge(new MyEdge(0.5), n0, n1, EdgeType.DIRECTED);
g.addEdge(new MyEdge(0.5), n1, n3, EdgeType.DIRECTED);
g.addEdge(new MyEdge(0.5), n3, n1, EdgeType.DIRECTED);
g.addEdge(new MyEdge(0.5), n1, n4, EdgeType.DIRECTED);
g.addEdge(new MyEdge(0.5), n3, o1);
g.addEdge(new MyEdge(0.5), n4, o2);
g.addEdge(new MyEdge(0.5), n4, o3);
g.addEdge(new MyEdge(0.5), n0, n2);
g.addEdge(new MyEdge(0.5), n2, n5);
g.addEdge(new MyEdge(0.5), n2, n6);
g.addEdge(new MyEdge(0.5), n6, n2);
g.addEdge(new MyEdge(0.5), n5, o4);
g.addEdge(new MyEdge(0.5), n5, o5);
g.addEdge(new MyEdge(0.5), n6, o6);
Layout<MyVertex, MyEdge> layout = new CircleLayout<MyVertex, MyEdge>(g);
layout.setSize(new Dimension(600, 600)); // sets the initial size of the space
// The BasicVisualizationServer<V,E> is parameterised by the edge types
BasicVisualizationServer<MyVertex, MyEdge> vv = new BasicVisualizationServer<MyVertex, MyEdge>(layout);
vv.setPreferredSize(new Dimension(650, 650)); //Sets the viewing area size
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<MyVertex>());
vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<MyEdge>());
vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
JFrame frame = new JFrame("Directed Graph ");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(vv);
frame.pack();
frame.setVisible(true);
}
}
答案 0 :(得分:0)
如果您知道顶点的位置,请使用StaticLayout。
如果你想要一个能够自动创建这种布局的布局算法,你需要自己提供......并且它不会是微不足道的。