/** * Converts the prefuse graph data into the jung graph data. * * @param vg the prefuse visual graph * @return graph the jung graph data */ public static edu.uci.ics.jung.graph.Graph<String, String> convertJungGraph(VisualGraph vg) { edu.uci.ics.jung.graph.Graph<String, String> graph = new UndirectedSparseGraph<String, String>(); if (vg != null) { Iterator<?> nodeIter = vg.nodes(); while (nodeIter.hasNext()) { VisualItem node = (VisualItem) nodeIter.next(); String nodeId = node.getString("id"); // System.out.println("node id == " + nodeId); graph.addVertex(nodeId); } Iterator<?> edgeIter = vg.edges(); while (edgeIter.hasNext()) { VisualItem edge = (VisualItem) edgeIter.next(); String node1 = edge.getString("node1"); String node2 = edge.getString("node2"); String edgeId = node1 + node2; // System.out.println("edge id == " + edgeId); graph.addEdge(edgeId, node1, node2, EdgeType.UNDIRECTED); } } return graph; }
@Before public void setUp() { m_vis = new Visualization(); m_t = TableTest.getTestCaseTable(); m_g = GraphTest.getTestCaseGraph(); m_t0 = m_t.getTuple(0); m_n0 = m_g.getNode(0); VisualTable vt = (VisualTable) m_vis.add("t", m_t); VisualGraph vg = (VisualGraph) m_vis.add("g", m_g); m_vt0 = vt.getItem(0); m_vn0 = (NodeItem) vg.getNode(0); TupleSet ts = m_vis.getFocusGroup(Visualization.FOCUS_ITEMS); ts.addTuple(m_vt0); ts.addTuple(m_vn0); }
/** * Finds a node by node id. * * @param vg * @param nodeId * @return VisualItem the node */ public static VisualItem findNode(VisualGraph vg, String nodeId) { if (vg != null) { Iterator<?> nodeIter = vg.nodes(); while (nodeIter.hasNext()) { VisualItem node = (VisualItem) nodeIter.next(); if (node.getString("id").equals(nodeId)) { return node; } } } return null; }
private void initDataGroups() { // create sample graph // 9 nodes broken up into 3 interconnected cliques Graph g = new Graph(); for (int i = 0; i < 3; ++i) { Node n1 = g.addNode(); Node n2 = g.addNode(); Node n3 = g.addNode(); g.addEdge(n1, n2); g.addEdge(n1, n3); g.addEdge(n2, n3); } g.addEdge(0, 3); g.addEdge(3, 6); g.addEdge(6, 0); // add visual data groups VisualGraph vg = m_vis.addGraph(GRAPH, g); m_vis.setInteractive(EDGES, null, false); m_vis.setValue(NODES, null, VisualItem.SHAPE, new Integer(Constants.SHAPE_ELLIPSE)); at = m_vis.addAggregates(AGGR); at.addColumn(VisualItem.POLYGON, float[].class); at.addColumn("id", int.class); // add nodes to aggregates // create an aggregate for each 3-clique of nodes Iterator nodes = vg.nodes(); for (int i = 0; i < 3; ++i) { AggregateItem aitem = (AggregateItem) at.addItem(); aitem.setInt("id", i); for (int j = 0; j < 3; ++j) { aitem.addItem((VisualItem) nodes.next()); } } }
public static JComponent demo(Graph g, String label) { // create a new, empty visualization for our data final Visualization vis = new Visualization(); VisualGraph vg = vis.addGraph(graph, g); vis.setValue(edges, null, VisualItem.INTERACTIVE, Boolean.FALSE); int[] palette = new int[] { ColorLib.rgb(77, 175, 74), ColorLib.rgb(55, 126, 184), ColorLib.rgb(228, 26, 28), ColorLib.rgb(152, 78, 163), ColorLib.rgb(255, 127, 0) }; int[] shape_palette = new int[] {Constants.SHAPE_ELLIPSE, Constants.SHAPE_RECTANGLE, Constants.SHAPE_TRIANGLE_UP}; TupleSet focusGroup = vis.getGroup(Visualization.FOCUS_ITEMS); focusGroup.addTupleSetListener( new TupleSetListener() { public void tupleSetChanged(TupleSet ts, Tuple[] add, Tuple[] rem) { for (int i = 0; i < rem.length; ++i) ((VisualItem) rem[i]).setFixed(false); for (int i = 0; i < add.length; ++i) { ((VisualItem) add[i]).setFixed(false); ((VisualItem) add[i]).setFixed(true); } vis.run("draw"); } }); // set up the renderers /* ShapeRenderer s = new ShapeRenderer(); s.rectangle(0, 0, 30, 30); vis.setRendererFactory(new DefaultRendererFactory(s));*/ MyRenderer tr = new MyRenderer(label); // MyRenderer tr = new MyRenderer(label); DefaultRendererFactory d = new DefaultRendererFactory(tr); EdgeRenderer MyEdgeRenderer = new EdgeRenderer(); d.add(new InGroupPredicate(edges), MyEdgeRenderer); vis.setRendererFactory(d); // -- set up the actions ---------------------------------------------- int maxhops = 1024, hops = 1024; final GraphDistanceFilter filter = new GraphDistanceFilter(graph, hops); ActionList draw = new ActionList(); draw.add(filter); // draw.add(new ColorAction(nodes, VisualItem.FILLCOLOR, ColorLib.rgb(180,180,255))); draw.add(new ColorAction(nodes, VisualItem.STROKECOLOR, 0)); draw.add(new ColorAction(nodes, VisualItem.TEXTCOLOR, ColorLib.rgb(0, 0, 0))); draw.add(new ColorAction(edges, VisualItem.FILLCOLOR, ColorLib.gray(100))); draw.add(new ColorAction(edges, VisualItem.STROKECOLOR, ColorLib.gray(170))); draw.add(new DataShapeAction(nodes, "type", shape_palette)); DataColorAction fill = new DataColorAction( "graph.nodes", "type", Constants.NOMINAL, VisualItem.FILLCOLOR, palette); // use black for node text ColorAction text = new ColorAction("graph.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0)); // use light grey for edges ColorAction edges = new ColorAction("graph.edges", VisualItem.STROKECOLOR, ColorLib.gray(200)); // create an action list containing all color assignments ActionList color = new ActionList(); color.add(fill); color.add(text); color.add(edges); // ColorAction fill = new ColorAction(nodes, // VisualItem.FILLCOLOR, ColorLib.rgb(200,200,255)); fill.add("_fixed", ColorLib.rgb(255, 100, 100)); fill.add("_highlight", ColorLib.rgb(255, 200, 125)); // Instead have to use GridLayout here - how do i create ForceDirectedLayout fdl = new ForceDirectedLayout(graph); // GridLayout fdl = new GridLayout(graph); ForceSimulator fsim = fdl.getForceSimulator(); fsim.getForces()[0].setParameter(0, -5f); ActionList animate = new ActionList(Activity.INFINITY); // ActionList animate = new ActionList(vis); animate.add(fdl); animate.add(fill); animate.add(new RepaintAction()); // finally, we register our ActionList with the Visualization. // we can later execute our Actions by invoking a method on our // Visualization, using the name we've chosen below. vis.putAction("draw", draw); vis.putAction("layout", animate); vis.runAfter("draw", "layout"); vis.putAction("color", color); // vis.putAction("layout", layout); // -------------------------------------------------------------------- // STEP 4: set up a display to show the visualization Display display = new Display(vis); display.setSize(2000, 2000); display.setForeground(Color.GRAY); display.setBackground(Color.WHITE); // main display controls display.addControlListener(new FocusControl(1)); display.addControlListener(new DragControl()); display.addControlListener(new PanControl()); display.addControlListener(new ZoomControl()); display.addControlListener(new WheelZoomControl()); display.addControlListener(new ZoomToFitControl()); display.addControlListener(new NeighborHighlightControl()); display.setForeground(Color.GRAY); display.setBackground(Color.WHITE); // -------------------------------------------------------------------- // STEP 5: launching the visualization // create a panel for editing force values final JForcePanel fpanel = new JForcePanel(fsim); final JValueSlider slider = new JValueSlider("Distance", 0, maxhops, hops); slider.addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent e) { filter.setDistance(slider.getValue().intValue()); vis.run("draw"); } }); slider.setBackground(Color.WHITE); slider.setPreferredSize(new Dimension(300, 30)); slider.setMaximumSize(new Dimension(300, 30)); Box cf = new Box(BoxLayout.Y_AXIS); cf.add(slider); cf.setBorder(BorderFactory.createTitledBorder("Connectivity Filter")); fpanel.add(cf); fpanel.add(Box.createVerticalGlue()); // create a new JSplitPane to present the interface JSplitPane split = new JSplitPane(); split.setLeftComponent(display); split.setRightComponent(fpanel); split.setOneTouchExpandable(true); split.setContinuousLayout(false); split.setDividerLocation(530); split.setDividerLocation(800); // position and fix the default focus node NodeItem focus = (NodeItem) vg.getNode(0); PrefuseLib.setX(focus, null, 400); PrefuseLib.setY(focus, null, 250); focusGroup.setTuple(focus); // now we run our action list and return return split; }