簡體   English   中英

Prefuse : 向 GraphView Demo 添加邊權重

[英]Prefuse : Adding edge weights to the GraphView Demo

我正在使用 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 不是一個接口而是一個類。 我做了一個簡單的demo來說明如何實現自定義邊緣渲染。

特征

向包含節點標簽首字母的邊添加標簽

方法

我做了一個快速而骯臟的解決方案,即復制 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM