Prefuse:为GraphView演示添加边权重

我正在使用prefuse可视化工具包,工具包中的GraphView Demo非常棒,提供了各种控件来可视化数据。

我可以为我的数据集生成GraphML并使用GraphView对其进行可视化。我希望有一个额外的事情是用权重或颜色编码标记边缘以展示两个节点之间的强度。

任何关于相同的输入都非常感谢..谢谢..

免责声明:我没有使用API​​只检查文档:)似乎API有一个EdgeRenderer接口,您应该实现以实现所需的行为。

参考: http : //prefuse.org/doc/manual/introduction/example/,http : //prefuse.org/doc/api/prefuse/render/DefaultRendererFactory.html

更新:首先是修正:实际上EdgeRenderer不是一个iterface而是一个类。 我做了一个简单的演示来说明如何实现自定义边缘渲染。

特征

向包含节点标签首字母的边添加标签

方法

我做了一个快速而肮脏的解决方案,即复制LabelRenderer并进行修改以处理边缘。

我将该类命名为MyEdgeRenderer

 public class MyEdgeRenderer extends AbstractShapeRenderer { 

使用原始EdgeRenderer绘制边线(请参阅下面的render()以了解渲染中的渲染器):

 protected EdgeRenderer m_edgeRenderer = new EdgeRenderer(); 

修改getText()以从节点获取首字母:

 protected String getText(VisualItem item) { EdgeItem edge = (EdgeItem)item; VisualItem item1 = edge.getSourceItem(); VisualItem item2 = edge.getTargetItem(); String t1 = null, t2 = null; if ( item1.canGetString(m_labelName) ) { t1 = item1.getString(m_labelName).substring(0,1); }; if ( item2.canGetString(m_labelName) ) { t2 = item2.getString(m_labelName).substring(0,1); }; if (t1 != null && t2 != null) return t1 + "-" + t2; else return null; } 

修改了getAlignedPoint()以将标签定位在边缘的一半:

 protected void getAlignedPoint(Point2D p, VisualItem item, double w, double h, int xAlign, int yAlign) { double x=0, y=0; EdgeItem edge = (EdgeItem)item; VisualItem item1 = edge.getSourceItem(); VisualItem item2 = edge.getTargetItem(); // label is positioned to the center of the edge x = (item1.getX()+item2.getX())/2; y = (item1.getY()+item2.getY())/2; ... 

修改render()到(I)先绘制线条和(II)使用黑色:

 public void render(Graphics2D g, VisualItem item) { m_edgeRenderer.render(g, item); ... // render text int textColor = ColorLib.color(Color.BLACK); // item.getTextColor() if ( text != null && ColorLib.alpha(textColor) > 0 ) { ... 

为了测试,我修改了Prefuse网站上的样本(http://prefuse.org/doc/manual/introduction/example/Example.java):

  // -- 3. the renderers and renderer factory --------------------------- // draw the "name" label for NodeItems LabelRenderer ir = new LabelRenderer("name"); ir.setRoundedCorner(8, 8); // round the corners // draw the "name" initials for EdgeItems MyEdgeRenderer er = new MyEdgeRenderer("name"); er.setRoundedCorner(8, 8); // round the corners // create a new default renderer factory // return our name label renderer as the default for all non-EdgeItems // includes straight line edges for EdgeItems by default vis.setRendererFactory(new DefaultRendererFactory(ir, er)); 

这只是一个演示自定义渲染的演示。 实际上,您可能会从图形模型中检索标签文本和颜色,即: EdgeItem.getString(), getTextColor() 。 我想这两个属性都可以来自GraphML数据。 此外,示例代码显示了如何为节点设置颜色,它也可能适用于边缘(虽然我没有尝试过):

  // -- 4. the processing actions --------------------------------------- ... // use black for node text ColorAction text = new ColorAction("graph.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0)); 
Interesting Posts