【问题标题】:Prefuse : Adding edge weights to the GraphView DemoPrefuse:向 GraphView Demo 添加边权重
【发布时间】:2011-12-22 02:06:45
【问题描述】:

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

我能够为我的数据集生成 GraphML 并使用 GraphView 将其可视化,我还想拥有的另一件事是用权重或颜色编码标记边缘,以展示两个节点之间的强度。

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

【问题讨论】:

    标签: java visualization prefuse graphml


    【解决方案1】:

    免责声明:我没有使用 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      相关资源
      最近更新 更多