【问题标题】:Creating data in Prefuse在 Prefuse 中创建数据
【发布时间】:2011-11-06 05:33:03
【问题描述】:

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

【问题讨论】:

    标签: graph population prefuse


    【解决方案1】:

    我刚刚解决了这个问题。这是Example.java 的调整版本,它显示了实现它的一种方法。

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

    问题特定代码位于makeGraph()。基本方法是创建一个Table(好吧,节点和边各一个),并向那些定义数据形状的表添加列;然后当您添加节点和边时,您可以添加相应的数据。一个问题是,对于边缘,您必须包含边缘的源/目标节点的列 - 有关更多详细信息,请参阅 GraphTable 文档。还有其他方法可以做到这一点(例如涉及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
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2012-02-11
      • 2011-10-04
      • 2019-12-26
      • 2021-12-24
      • 2019-03-23
      相关资源
      最近更新 更多