2017-05-03 3 views
0

グラフの視覚化のためにJungライブラリを使い始めました。現在の主な問題は、頂点にラベルやメタデータを設定する方法がわかりません。頂点の特定の属性に応じて、頂点の色を別にしたいと思います。 Nodeクラスのオブジェクトには追加のInteger-valueが含まれています。頂点の追加属性(getGroup()による)として追加したいと思います。次のコードは、各ノードのgetId() - 文字列を可視化します。Jungライブラリを使った頂点のラベル

任意の勧告?

この

あるメインクラスで私の次のコード:

Graph<String,Double> g = new SparseGraph<String,Double>(); 
    List<Link> linkList = new ArrayList<Link>(); 
    List<Node> nodeList = new ArrayList<Node>(); 
    linkList = f.getLinks(); 
    nodeList = f.getNodes(); 
    for(Node nodeElement:nodeList){ 
     g.addVertex(nodeElement.getId()); 
    } 
    for(Link linkElement:linkList){ 
     g.addEdge(linkElement.getValue(), linkElement.getSource(), linkElement.getTarget()); 
    } 

    VisualizationImageServer vs = 
       new VisualizationImageServer(
       new SpringLayout(g), new Dimension(500, 500)); 

    vs.getRenderContext().setVertexLabelTransformer(new ToStringLabeller() { 
     public String transform(Object v) { 
      return Integer.toString(((Node)v).getGroup()); 
     } 
    }); 

    JFrame frame = new JFrame(""); 
    frame.getContentPane().add(vs); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 

答えて

0

は、あなたが使用しているJUNGのバージョンを指定していないが、あなたは右の一般的な考え方持っている:(setVertexLabelTransformerを呼び出す)を持ちますレンダリングする文字列にノードを変換する関数。

あなたのコードにはいくつかの問題が書かれていますが、上に引用したコードでどのように動作を報告しているのか分かりません。

(0)なぜNodeではなく、ノードIDを頂点として追加するのかわかりません。 LinkのノードIDまたはNodeのエンドポイントはありますか。 いずれにしても、Nodeを追加しないと、コードから、頂点グループがどのように使用可能になると書かれているか分かりません。

(1)グラフの頂点はNodeではなくノードIDですが、transform()に渡された頂点オブジェクトはNodeにキャストしています。私はこれがClassCastExceptionを投げると期待します。

(2)あなたの頂点が実際にNodeオブジェクトであると仮定しても、 ラベルに表示されているものがグループではなく頂点IDであると報告していることに驚いています。あなたは頂点ラベルで要求しているグループです。 IDがまったく表示されるとは思っていません。

つまり、頂点がNodeのオブジェクトで、複数の要素を表示したい場合は、かなり簡単です。 Nodeオブジェクトで必要な機能を実行するだけです。
*その関数がtoString()の場合、ToStringLabellerを使用できます(実際はデフォルトにする必要がありますので、指定する必要はありません)。以下で詳しく説明します。 *その機能がある場合には(例えば)getLabel()を、これは(Javaの8に)動作するはずです:あなたは

のJava 8を使用していない場合は

// either of these should work 
setVertexLabelTransformer(Node::getLabel()) 
setVertexLabelTransformer(v -> v.getLabel())  

か、匿名の内部クラスのことを行うことができますでない場合は、Nodeオブジェクトを頂点にしたい場合は、ノードに頂点オブジェクト(ノードID)をマッピングする方法(例えば、Map<String, Node>)を提供し、そのマップを変換する関数に渡す必要がありますラベルへの頂点:

setVertexLabelTransformer(v -> labelToNode.get(v).getLabel()) 

注:ToStringLabeller()には、通常、transform()メソッドをオーバーライドしないでください。オブジェクト自体のtoString()をラベルとして使用することを指定するだけです。

// These two are equivalent 
setVertexLabelTransformer(v -> v.toString()) 
setVertexLabelTransformer(new ToStringLabeller()) 

ヒントについて

+0

ToStringLabeller()は、Java 8 :)に先行、言うまでもなく)ありがとう。私は最新バージョンのJung 2.1.1を使用しています。私は新しい機能を定義するために関数applyを実装(オーバーライド)しました。今は動作しますが、約500ノードのパフォーマンスで8GBのRAMノートブックに問題が発生します。 – Matzka

関連する問題