gpt4 book ai didi

graph - 在 Prefuse 中创建数据

转载 作者:行者123 更新时间:2023-12-05 00:37:12 26 4
gpt4 key购买 nike

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

最佳答案

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

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

特定问题的代码在 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
}

}

关于graph - 在 Prefuse 中创建数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7233956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com