编程语言
首页 > 编程语言> > Java-Prefuse:将边缘权重添加到GraphView Demo

Java-Prefuse:将边缘权重添加到GraphView Demo

作者:互联网

我使用的是预熔式可视化工具包,该工具包中的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));

标签:java,visualization,prefuse,graphml
来源: https://codeday.me/bug/20191011/1892178.html