2

私は prefuse 視覚化ツールキットを使用しています。ツールキットの GraphView Demo は、データを視覚化するためのさまざまなコントロールを提供する素晴らしいものです。

データセットの GraphML を生成し、GraphView を使用して視覚化することができます。追加したいことの 1 つは、2 つのノード間の強度を示すために、重みまたは色分けでエッジにラベルを付けることです。

同じことについての入力は大歓迎です..ありがとう..

4

1 に答える 1

3

免責事項: ドキュメントを確認しただけで、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 Web サイト (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));
于 2011-11-04T14:45:34.607 に答える