JUNG(Java Graph):頂点ラベルとエッジラベルが重複しないようにする方法

StackOverflow https://stackoverflow.com/questions/1422665

  •  07-07-2019
  •  | 
  •  

質問

現在、 Jung を使用してグラフを描画しています(実際、グラフはグラフではなく!)。問題は、頂点ラベルとエッジラベルが頂点とエッジと重なっていることです。これは、奇妙なグラフになります。問題は特定のレイアウトアルゴリズムに限定されません(FRLayoutを使用していますが)。

これらの重複を防ぐようにJUNGに指示する可能性はありますか?これが既に実装されており、唯一の問題は正しいオプションを見つけることだと思います!

役に立ちましたか?

解決

(以下の回答はJung2を前提としています。私はpre-Jung2に詳しくありません)。

Jungの強みの1つは、非常に拡張可能であり、簡単に拡張できることです。 Jungでは、さまざまなトランスフォーマー(単純なレンダリングプロパティ)、レンダラー(より複雑なレンダリング)などをプラグインして、デフォルトが適切でない場合の動作をカスタマイズできます。これらは通常、RenderContext(VisualizationViewerから取得できます)にインストールされます。

逆に言えば、その欠点は複雑さとまともな文書の欠如です。中程度から重いカスタマイズを行う場合は、Jungソースを掘り下げる必要があります。

たとえば、新しい頂点ラベルレンダラー(Renderer.VertexLabelインターフェイス)をプラグインすることにより、頂点ラベルのレンダリングをカスタマイズできます。たとえば、BasicVertexLabelRendererをインスタンス化し、別の位置(北、西、中央など)を指定できます。形状をその円よりも大きなものに変更する場合は、ラベルを中央に配置できます(そうするには、独自の頂点形状トランスフォーマー(Transformerのインスタンス)をインストールします)。または、ラベルテキストの下に背景をレンダリングするこのインターフェイスの独自のカスタム実装を作成できます。

独自の調整バージョンのRenderer.EdgeLabel(JungのBasicEdgeLabelRendererを参照)をインストールして、エッジラベルの位置をカスタマイズすることもできます。

他のヒント

ラベルオフセットを設定するだけです:

vv.getRenderContext().setLabelOffset(20);

vv は、 VisualizationViewer オブジェクトです。

ところで、色を変更したい場合、最初は大きな苦痛のように見えます。しかし、最近この小さなトリックを発見しました:

Transformer labelTransformer = new ChainedTransformer<String,String>(new Transformer[]{
            new ToStringLabeller<String>(),
            new Transformer<String,String>() {
            public String transform(String input) {
                return "<html><font color=\"yellow\">"+input;
            }}});

context.setVertexLabelTransformer(labelTransformer);

これは単なる実装方法であり、コードの作成者はおそらくそれを問題とは思わないでしょう。 JUNGライブラリはオープンソースですので、必要に応じて変更してください。

コードを変更したくない場合、ラベルを読みやすくするための簡単な修正方法は、ラベルの色を変更するだけで、エッジとは異なるようにすることです。

エッジラベルが重複するという同じ問題が発生しました。エッジラベルを配置するために使用した迅速で汚い解決策は、文字列値に特定の長さの空白を埋め込むことです。

//pad some white spaces to value of edge when adding edges to the graph
graph.addEdge(String.format("%-35s", "Edge-A"), 1, 2);

特に2部グラフを作成する場合、中央でエッジラベルが曇ったり重なったりしないようにします。これが皆さんの一部に役立つことを願っています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top