描画ネットワークトポロジのためのオープンソースJavaグラフ描画フレームワーク(Jung and Prefuse)の比較

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

質問

次の要件を備えたネットワーク図に使用するオープンソースJavaグラフ描画フレームワークのどれはどれですか?グラフには1000ノード未満のノードがあります。

1)平行エッジがあります
2)単一のグラフ内の方向性と無向エッジ
3)画像で表されるノード
4)ノードとエッジとのユーザーの相互作用
5)ノードとエッジを動的に追加/削除します
6)ノードとエッジの複数のラベル付けでは、ユーザーが異なるレベルのラベルをオフ/オンにすることができます。 (レイヤーを描いたり、レイヤーでオフにしたりするなど)
7)スター、リング、メッシュトポロジを表示するさまざまなレイアウトアルゴリズム

JungとPrefuseを評価しました。これは私が私の要件のそれぞれについて見つけたものです。

1)事前使用は、Jungがサポートしている間、平行したエッジを表示できません。並列エッジを表示するために、事前使用コードを操作できますか?これには基本的なデータレベルの変更が含まれるため、通常のカスタマイズされたレンダリングが変更されるのはこれがより難しいと思います。

2)プレハイズとユングの両方で、グラフを組み合わせたグラフ(方向性と無向エッジの両方)への参照は見つかりませんでした。誰かがそうでなければ知っていますか?

3)これは、事前使用とユングの両方で簡単に思えます

4)再びプレハスとユングの両方がユーザーの相互作用のサポートを提供します。

5)プレハイズとユングの両方がそれをサポートしています。各フレームワークは、グラフを再描画しながらどのように機能しますか?私は別の投稿で、PREAMUSEが動的な更新でうまく機能しないことを見ました(プリフスツールキット:ノードとエッジを動的に追加します)

6)これは、グラフを変更して再描画することになります。したがって、質問は5と同じになります)

7)JungとPrefuseの両方に複数のレイアウトアルゴリズムがあります。しかし、JungとPrefuseの両方でFruchtermanreingoldlayoutを使用して同じデータセットを表示しようとしたとき、私は異なるディスプレイを取得します。何かアイデアはなぜですか?どういうわけか、事前使用のレイアウトアルゴリズムは、Jungよりも優れたレイアウトを表示しているようです(レンダリングも優れていると思います)。 ForcedirecedLayout/FruchterManreingOldLayoutなどのレイアウトを実現し、Star、Circle、Meshトポロジーに直接マッピングします。

これらの要件以外では、Prefuseは表現とクエリ言語を適切にサポートしていますが、Jungとは異なり積極的に開発されていないようです。どちらがより良い視覚化を持っていますか?適切な提案と欠点を克服する方法はありますか?

私が使用できる他のフレームワークはありますか?

役に立ちましたか?

解決

数年前(2007年?)私は事前使用を使用して、コールデータレコードを視覚化します。私はプレハス、ジョン、Jgraphなどを考えて、プレフィューズを選びました。最初は、頭を包み込むのは少し難しいですが、一度慣れたら本当に簡単に(拡張するのができます)、使いやすいです。同じことがユングについても同じことが言えると思いますが、私はそれを試したことはありません。

1)PREFUSEでは、並列エッジを描画するために独自のカスタムレンダラーを追加するのは非常に簡単です - デフォルトのedgerendererをサブクラス化して、render()メソッドをオーバーライドできます。 「基本的なデータレベルの変更」は必要ありません。これをMVCのものと考えたい場合、これはすべてビューパートにあります。

2)これは実際にはまったく問題ではありません。これを行うには、複数の方法があります。1)2つのレンダラーを持つことができます。1つは、指示されたエッジを描画するために、もう1つは無向エッジを描くために正常に動作し、エッジを適切にグループ化します。 2)フラグを置いて(プレハイズスピーチのバッキングテーブルタプルにブール列を追加)、エッジが指示されているかどうかを示し、そのフラグに従ってエドジェンダーの矢印描画部分をスキップします。

3)これは非常に簡単です

4)同上

5)最後の事前使用リリースは、「プレハスベータリリース2007.10.21」です。私はその前に、ノードを動的に追加または削除するときに可能な人種状態があるものを使用しました - 私が推測するいくつかの同期キーワードが欠落していました。ノードを追加または削除するときに、すべてのアニメーションとアクション(色、サイズ、レイアウト)を確実に停止することでそれを解決しました - また、Luceneインデックスを更新することも忘れないでください(組み込みのLucene検索エンジンを使用する場合)。最新のものはこのレースの問題を解決することになっていますが、私はそれを試してみる機会がありませんでした。

6)「複数のラベル付け」に言及したので、これは「グラフを変更して再描画する」という問題ではないと思います。これは、関連ラベルのみを描くようにラベル/エッジレンダラーをカスタマイズするだけの問題です。 。また、これは5にまったく関係していないと思います。

7)FruchterManreingoldlayoutのプレハスとJungのレンダリングが異なることは驚くことではありません。各実装が計算を開始する開始ノードに影響を与える可能性のある要因がいくつかあります。事前使用でさまざまなビルトイングラフレイアウトアルゴリズムを試してみるのは非常に簡単です。これにより、どちらがあなたが望むものに最も近いかをチェックすることができます。 Star LayoutのRadiallayoutとBalloonTreeLayoutをチェックしてください。 ForcedirecedLayoutは、ノードの配置が「安定」するためにかなりの数の反復が必要です。これらの反復は、バックグラウンドで実行して最終結果をレンダリングできるように、これらの反復を表示する必要はないことに注意してください。

私はユングを使用していないので、それについてあまりコメントすることはできません。

事前に私の経験に基づいて、私はそれを非常によく(imho)考えているデザインとコンポーネント間の応答性の分離のために強くお勧めします。 Jeffrey Heer(Prefuse Author)は本当に良い仕事をしました。

プレフィューズを使用する場合に注意すべきこと(これらは、事前に作業するときに私が鮮明に覚えている2つの「痛み」です):

1)ズームアウトすると、ノードのラベルが適切にズームアウトされないバグがあり、ノードの境界ボックスがノードの境界線を描画すると、ノードの境界が動きます。箱。 IIRCこれは、AWTフォントメトリック自体のバグによって引き起こされます。回避策は、ラベルとノードの境界ボックスの間に十分なマージンを残すことです。

2)組み込みのレイアウトを拡張する場合、アクセスしたいスーパークラスのメンバーが保護されている代わりにプライベート属性が与えられるように、1つまたは2つの「スコープ問題」に遭遇する可能性があります。ライブラリ自体または継承せずに新しいクラスを作成します(少し苦痛になる可能性があります!)。他のJavaライブラリについても同じことを言うことができると思います。誰もが後知恵の利益を持っているわけではありませんか? :)

1か月前(私がこれを書いているとき)この質問をしたので、あなたの決定が何であり、実装を進めた場合にどのようになったのかを知りたいと思います。

他のヒント

私はユングのクリエイターとメンテナーの一人なので、以下の回答に留意してください。

まず、プレフィューズの著者は友人の友人であると言うべきです(そして、はい、私たちは会いました)。彼は素晴らしい仕事をしました。私は事前使用を経験していませんが、それによって作成されたいくつかの美しい視覚化を見てきました。

Jungの質問に対する答えは次のとおりです。それらのいくつか((1)、(2)、(4)はで実証されています PluggableRendererDemo:

  1. サポートされています(パフォーマンス上の理由ですべてのサポート平行エッジではなく、適切なデータモデルが必要です)
  2. サポートされています(繰り返しますが、適切なデータモデルが必要です)
  3. サポートされています(参照してください ImageShaperDemo)
  4. サポート(ほとんどのデモ)
  5. サポートされています(参照してください GraphEditorDemo)
  6. 直接サポートされていませんが、ラベルを動的に変更し、HTMLを使用して複雑なラベルをレンダリングすることができます。
  7. Jungのレイアウトアルゴリズムは、一般的なネットワーク向けです(木などのいくつかの例外を除き)。ただし、独自のレイアウトアルゴリズムを確実に作成できますが、多くの人がそうしています。

お役に立てれば。

私はあなたがJungを指定し、事前に指定したことを知っていますが、...私はTomsawyerとYfilesの両方で良い経験をしました。提案した要件リストは、これら2つの非常に基本的なものであり、さらに多くのサポートをサポートしています。

走った。

評価することをお勧めします jgraph それも。

私は @Holyeekの答えが好きです。これは、事前使用のために、2つのソリューション(指向エッジと無向エッジの両方)の私の実装です。

public class MyRenderFactory implements RendererFactory
{
    private NodeRenderer nodeRenderer = new NodeRenderer();
    private EdgeRenderer defaultEdgeRenderer = new EdgeRenderer();
    private EdgeRenderer undirectedEdgeRenderer = new EdgeRenderer(EdgeRenderer.EdgeType.LINE, EdgeRenderer.EdgeArrowType.NONE);

    public static String directedness = "myEdgeDirectedness";

    public enum EdgeDirected
    {
        directed, undirected;

        public static EdgeDirected fromIsDirected(boolean isDirected)
        {
            if (isDirected)
            {
                return directed;
            }
            return undirected;
        }
    }

    @Override
    public Renderer getRenderer(VisualItem<?> visualItem)
    {
        if (visualItem instanceof EdgeItem)
        {
            if (visualItem.get(directedness).equals(PrefuseGraphConverter.EdgeDirected.undirected))
            {
                return undirectedEdgeRenderer;
            }
            return defaultEdgeRenderer;
        }
        return nodeRenderer;
    }
}

...他の場所では、グラフが作成される場所...

MyRenderFactory.EdgeDirected directedness =
        MyRenderFactory.EdgeDirected.fromIsDirected(myEdge.isDirected());
prefuseEdge.set(MyRenderFactory.directedness, directedness);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top