如何在JUNG(Java Universal Network / Graph Framework)中可视化状态转换图?

时间:2014-03-12 06:51:50

标签: java graph jung markov-chains

我对可视化部分感到困惑,我创建了一个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);
}
}

1 个答案:

答案 0 :(得分:0)

如果您知道顶点的位置,请使用StaticLayout。

如果你想要一个能够自动创建这种布局的布局算法,你需要自己提供......并且它不会是微不足道的。