Graph 在预使用中创建数据

Graph 在预使用中创建数据,graph,population,prefuse,Graph,Population,Prefuse,我是新手。演示示例都是从文件/数据库加载的数据。是否有任何方法可以动态创建数据,而不是从文件加载。例如,我想创建一个树数据结构并将其可视化。任何简单的工作示例都会对我很有帮助 我刚刚开始解决这个问题。下面是Example.java的一个经过调整的版本,它展示了实现这一点的一种方法 我不是从socialnet.xml加载数据,而是以编程方式生成数据(基于Aggregate.java但不包含聚合内容),并向每个节点和每个边缘添加一个字段。节点字段是一个简单的布尔标志,用于控制渲染的颜色;Edge字段

我是新手。演示示例都是从文件/数据库加载的数据。是否有任何方法可以动态创建数据,而不是从文件加载。例如,我想创建一个树数据结构并将其可视化。任何简单的工作示例都会对我很有帮助

我刚刚开始解决这个问题。下面是
Example.java
的一个经过调整的版本,它展示了实现这一点的一种方法

我不是从
socialnet.xml
加载数据,而是以编程方式生成数据(基于
Aggregate.java
但不包含聚合内容),并向每个
节点和每个
边缘添加一个字段。
节点
字段是一个简单的布尔标志,用于控制渲染的颜色;
Edge
字段是一个标签,但它还没有被渲染。我还在做那个!:-)

特定于问题的代码位于
makeGraph()
中。基本方法是创建一个
(节点和边各一个),并向这些表中添加定义数据形状的列;然后,在添加节点和边时,可以添加相应的数据。一个问题是,对于边缘,必须包含边缘源/目标节点的列-有关更多详细信息,请参阅
图形
文档。还有其他方法可以做到这一点(例如涉及
Schema
),但我还没有使用它们

希望这有帮助

import javax.swing.JFrame;

import prefuse.Constants;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.action.ActionList;
import prefuse.action.RepaintAction;
import prefuse.action.assignment.ColorAction;
import prefuse.action.assignment.DataColorAction;
import prefuse.action.layout.graph.ForceDirectedLayout;
import prefuse.activity.Activity;
import prefuse.controls.DragControl;
import prefuse.controls.PanControl;
import prefuse.controls.ZoomControl;
import prefuse.data.Edge;
import prefuse.data.Graph;
import prefuse.data.Node;
import prefuse.data.Table;
import prefuse.render.DefaultRendererFactory;
import prefuse.render.EdgeRenderer;
import prefuse.render.Renderer;
import prefuse.render.ShapeRenderer;
import prefuse.util.ColorLib;
import prefuse.visual.VisualItem;

public class Example extends Display {

    private Graph makeGraph() {

        // Create tables for node and edge data, and configure their columns.
        Table nodeData = new Table();
        Table edgeData = new Table(0,1);
        nodeData.addColumn("flag", boolean.class);
        edgeData.addColumn(Graph.DEFAULT_SOURCE_KEY, int.class);
        edgeData.addColumn(Graph.DEFAULT_TARGET_KEY, int.class);
        edgeData.addColumn("label", String.class);
        // Need more data in your nodes or edges?  Just add more
        // columns.

        // Create Graph backed by those tables.  Note that I'm
        // creating a directed graph here also.
        Graph g = new Graph(nodeData, edgeData, true);

        // Create some nodes and edges, each carrying some data.
        // There are surely prettier ways to do this, but for the
        // example it gets the job done.
        for ( int i=0; i<3; ++i ) {
            Node n1 = g.addNode();
            Node n2 = g.addNode();
            Node n3 = g.addNode();
            n1.setBoolean("flag", false);
            n2.setBoolean("flag", true);
            n3.setBoolean("flag", true);
            Edge e1 = g.addEdge(n1, n2);
            Edge e2 = g.addEdge(n1, n3);
            Edge e3 = g.addEdge(n2, n3);
            e1.setString("label", "a");
            e2.setString("label", "a");
            e3.setString("label", "a");
        }
        Edge e4 = g.getEdge(g.addEdge(0, 3));
        Edge e5 = g.getEdge(g.addEdge(3, 6));
        Edge e6 = g.getEdge(g.addEdge(6, 0));
        e4.setString("label", "b");
        e5.setString("label", "b");
        e6.setString("label", "b");
        return g;
    }

    public Example() {

        super(new Visualization());

        Graph graph = makeGraph();

        m_vis.addGraph("graph", graph);
        m_vis.setInteractive("graph.edges", null, false);
        m_vis.setValue("graph.nodes", null, VisualItem.SHAPE,
                new Integer(Constants.SHAPE_ELLIPSE));

        Renderer nodeR = new ShapeRenderer(20);
        EdgeRenderer edgeR = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_CURVE, prefuse.Constants.EDGE_ARROW_FORWARD);

        DefaultRendererFactory drf = new DefaultRendererFactory();
        drf.setDefaultRenderer(nodeR);
        drf.setDefaultEdgeRenderer(edgeR);
        m_vis.setRendererFactory(drf);

        int[] palette = new int[] {
            ColorLib.rgb(255,180,180), ColorLib.rgb(190,190,255)
        };
        ColorAction nStroke = new ColorAction("graph.nodes", VisualItem.STROKECOLOR);
        nStroke.setDefaultColor(ColorLib.gray(100));

        DataColorAction nFill = new DataColorAction("graph.nodes", "flag",
            Constants.NOMINAL, VisualItem.FILLCOLOR, palette);
        ColorAction edges = new ColorAction("graph.edges",
            VisualItem.STROKECOLOR, ColorLib.gray(200));
        ColorAction arrow = new ColorAction("graph.edges",
            VisualItem.FILLCOLOR, ColorLib.gray(200));
        ActionList color = new ActionList();
        color.add(nStroke);
        color.add(nFill);
        color.add(edges);
        color.add(arrow);

        ActionList layout = new ActionList(Activity.INFINITY);
        layout.add(new ForceDirectedLayout("graph"));
        layout.add(new RepaintAction());

        m_vis.putAction("color", color);
        m_vis.putAction("layout", layout);

        setSize(720, 500); // set display size
        pan(360, 250);
        setHighQuality(true);
        addControlListener(new DragControl());
        addControlListener(new PanControl());
        addControlListener(new ZoomControl());

        m_vis.run("color");
        m_vis.run("layout");

    }

    public static void main(String[] argv) {
        Example ex = new Example();
        JFrame frame = new JFrame("prefuse example");
        frame.getContentPane().add(ex);
        frame.pack();           // layout components in window
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true); // show the window
    }

}
import javax.swing.JFrame;
导入prefuse.Constants;
导入prefuse.Display;
导入使用前可视化;
导入prefuse.action.ActionList;
导入prefuse.action.repaitaction;
导入prefuse.action.assignment.ColorAction;
导入prefuse.action.assignment.DataColorAction;
导入prefuse.action.layout.graph.ForceDirectedLayout;
导入prefuse.activity.activity;
导入prefuse.controls.DragControl;
导入prefuse.controls.PanControl;
导入prefuse.controls.ZoomControl;
导入prefuse.data.Edge;
导入prefuse.data.Graph;
导入prefuse.data.Node;
导入prefuse.data.Table;
导入prefuse.render.DefaultRenderFactory;
导入prefuse.render.edgerender;
导入prefuse.render.Renderer;
导入prefuse.render.shaperender;
导入prefuse.util.ColorLib;
导入prefuse.visual.VisualItem;
公共类示例扩展了显示{
私有图makeGraph(){
//为节点和边缘数据创建表,并配置其列。
Table nodeData=新表();
表edgeData=新表(0,1);
addColumn(“标志”,boolean.class);
addColumn(Graph.DEFAULT\u SOURCE\u KEY,int.class);
addColumn(Graph.DEFAULT\u TARGET\u KEY,int.class);
addColumn(“标签”,String.class);
//节点或边中需要更多数据吗?只需添加更多数据即可
//列。
//创建由这些表支持的图形
//在这里创建一个有向图。
图g=新图(nodeData,edgeData,true);
//创建一些节点和边,每个节点和边承载一些数据。
//当然有更好的方法可以做到这一点,但对于
//例如,它完成了任务。
对于(int i=0;i