Vergleichen Open-Source-Java-Zeichnen von Graphen-Frameworks (JUNG und Prefuse) zum Zeichnen von Netzwerktopologie

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

Frage

, die von der Open-Source-Java Graph Frameworks Zeichnung für ein Netzdiagramm mit den folgenden Anforderungen zu bedienen? Der Graph wird weniger als 1000 Knoten.

1) parallele Kanten
2) gerichteten und ungerichteten Kanten innerhalb eines einzigen Graphen
3) Knoten, die durch Bilder dargestellt
4) eine Benutzerinteraktion mit Knoten und Kanten
5) dynamisch hinzufügen / löschen Knoten und Kanten
6) mehrere Kennzeichnung auf Knoten und Kanten können verschiedene Ebenen der Kennzeichnung von Nutzern ausgeschaltet / schaltet werden. (Wie in Schichten zeichnen und Ausschalten / auf einer Schicht)
7) verschiedene Layout-Algorithmen zur Anzeige Stern-, Ring-, Mesh-Topologien

ausgewertet I JUNG und Prefuse. Dies ist, was ich für jeden meiner Anforderungen gefunden.

1) Prefuse nicht parallele Kanten angezeigt werden, während JUNG es unterstützt. Kann prefuse Code parallelen Kanten anzuzeigen manipuliert werden? Da diese Ebene Grunddaten an den Veränderungen Ich glaube, das schwieriger sein würde, dass die üblichen angepasst Rendering Änderungen.

2) Ich habe nicht jede Bezugnahme auf kombinierte grafische Darstellung finden (beide gerichteten und ungerichteten Kanten) in beiden prefuse und JUNG. Kennt jemand anders?

3) Das scheint einfach, sowohl mit Prefuse und JUNG

4) wiederum beide prefuse JUNG und bieten Unterstützung für die Interaktion mit dem Benutzer.

5) Beide prefuse und JUNG unterstützt. Wie verhält sich jeder Rahmen, während die Grafik neu zu zeichnen? Ich sehe in einem anderen Beitrag, dass prefuse nicht gut für dynamisch-Updates ( Prefuse Toolkit: dynamisch das Hinzufügen von Knoten und Kanten )

6) Das kommt darauf an, die Grafik zu modifizieren und neu zu zeichnen es. So ist die Frage das gleiche wie 5 wird)

7) Sowohl JUNG und prefuse mehrere Layout-Algorithmen hat. mit FruchtermanReingoldLayout sowohl JUNG und Prefuse ich verschiedene Displays aber Als ich versuchte, die gleiche Datenmenge anzuzeigen. Irgendwelche Ideen, warum? Irgendwie sind die Layout-Algorithmen in Prefuse scheinen ein besseres Layout als in JUNG anzuzeigen (Rendering ist auch besser, glaube ich), obwohl die meisten der Layout-Algorithmen in Prefuse auf JUNG Implementierung basieren. Prefuse Layouts wie ForceDirectedLayout / FruchtermanReingoldLayout und CircleLayout Karten direkt zum Stern, Kreis, Mesh-Topologien.

Außerhalb dieser Anforderungen hat prefuse gute Unterstützung für Ausdrücke und Abfragesprache, sondern sieht aus wie er nicht aktiv im Gegensatz zu JUNG entwickelt. die man hat eine bessere Visualisierung? Irgendwelche Vorschläge, auf denen man, wird geeignet sein und wie die Mängel zu überwinden?

Jede andere Rahmenbedingungen gibt, die kann ich verwenden?

War es hilfreich?

Lösung

Vor ein paar Jahren (2007?) Ich verwende prefuse Aufzeichnungen Anrufdaten zu visualisieren. Ich betrachtete prefuse, jung, jgraph und ein paar andere und wählte prefuse. Zunächst ist es ein bisschen schwierig, meinen Kopf um prefuse zu wickeln, aber sobald ich mit ihm vertraut habe es wirklich einfach (zu verlängern) und macht Spaß. Ich denke, das gleiche gilt für JUNG sagen, aber ich es nie versucht.

1) In prefuse ist es sehr einfach Ihre eigenen Renderer zum Zeichnen von parallelen Kanten hinzuzufügen - Sie die Standard-EdgeRenderer Unterklasse und überschreiben die Render () -Methode. Es gibt keine „Grunddaten Pegeländerungen“ benötigt. Das ist alles in der Ansicht Teil, wenn Sie es als ein MVC Zeug denken mögen.

2) Dies ist nicht wirklich ein Problem überhaupt nicht. Es gibt mehr als einen Weg, dies zu tun: 1) Sie zwei Renderer haben - eine für die gerichteten Kanten zeichnen und eine für die ungerichtete Kanten zeichnen und sie werden gut funktionieren, und die Gruppe in geeigneter Weise der Kanten. 2) Setzen eines Flags (fügen eine Boolesche Spalte in dem Trägertisch Tupels in prefuse sprechen), um anzuzeigen, ob die Kante gerichtet ist, und fahren den Pfeil Zugabschnitt entsprechend im EdgeRender nach dieser Flagge.

3) Dies ist super einfach

4) dito

5) Die letzte prefuse Mitteilung ist "prefuse Beta-Version 2007.10.21". Früher habe ich die eine vorher, die eine mögliche Race-Bedingung, wenn das Hinzufügen oder Knoten dynamisch zu löschen - es wurde ein paar synchronisiert Schlüsselwörter fehlt, denke ich. Ich löste das sicher, indem sie alle die Animation und Aktionen (Farbe, Größe, Layout) beim Hinzufügen oder Entfernen von Knoten zu stoppen - auch nicht vergessen, wie gut Ihren Lucene-Indizes zu aktualisieren (wenn Sie sein verwenden integrierte in Lucene Suchmaschine ). Die späteste sollte dieses Rennen Problem lösen, aber ich hatte nie die Gelegenheit, es auszuprobieren.

6) Da Sie „multiple Kennzeichnung“ erwähnt denke ich, dies nicht eine Frage der „die Grafik zu modifizieren und neu zu zeichnen it“ - es ist nur eine Frage der Label / edge Renderer Customizing nur die entsprechenden Etiketten zu ziehen, so dies nicht wirklich ist ein großes Thema. Ich auch glaube nicht, das zu 5 überhaupt in Zusammenhang steht.

7) Ich bin überrascht nicht, dass prefuse und JUNG Wiedergabe des FruchtermanReingoldLayout unterschiedlich sind - es gibt ein paar Faktoren, die diese einer von ihnen der Startknoten beeinflussen könnten, wo jede Implementierung der Berechnung beginnen, damit ich nicht viel zu befürchten wäre dieses Problem. Es ist ganz einfach, die verschiedenen eingebauten Graph Layout-Algorithmen in prefuse auszuprobieren, so können Sie voran gehen und prüfen, welche man am nächsten ist, was Sie haben möchten. Überprüfen Sie die RadialLayout und BalloonTreeLayout für den Stern-Layout aus. ForceDirectedLayout braucht ziemlich viele Iterationen für die Platzierung von Knoten „stabil“ zu sein. Beachten Sie, dass diese Iterationen nicht notwendig sind, angezeigt werden, so dass Sie es im Hintergrund laufen können und das Endergebnis machen.

Ich habe nicht JUNG verwenden, damit ich nicht viel dazu sagen kann.

Aufgrund meiner Erfahrung mit prefuse Ich empfehle es aufgrund der sehr gut (IMHO) dachte Design und die Trennung von resposibility zwischen den Komponenten. Jeffrey Heer (prefuse Autor) wirklich einen guten Job dort.

Reise zu beachten, wenn Sie verwenden prefuse (das sind die beiden „wunde Daumen“, dass ich erinnere mich lebhaft an, wenn sie mit prefuse Arbeits):

1) Es ist ein Fehler, der beim Herauszoomen, die Knotenetiketten werden nicht in geeigneter Weise so gezoomt, dass es den Begrenzungsrahmen des Knotens überläuft, die Schriftzeichen Artefakte hinterlassen wird, wenn der Knoten bewegt, da der Renderer nur löscht und redraws stopfen innerhalb der Knoten Begrenzungsrahmen. IIRC wird dies durch einen Fehler in AWT verursacht Font Metric selbst. Die Abhilfe ist reichlich Spielraum zwischen dem Etikett und dem Knoten Begrenzungsrahmen zu verlassen.

2) Wenn man die eingebaute in Layouts, können Sie begegnen einem oder zwei „Scoping Problem“, wo ein Mitglied der übergeordneten Klasse, dass Sie möchten, den Zugang zu haben, um das private Attribut angegeben wird, anstatt geschützt, so ist die Lösung um entweder die Bibliothek selbst zu ändern oder eine neue Klasse erstellen, ohne inheriting (die ein bisschen schmerzhaft sein kann!). Ich denke, man das gleiche für einige andere Java-Bibliotheken sagen kann. Nicht jeder hat im Nachhinein nicht? :)

Da Sie diese Frage zu einem Monat fragte vor (zu der Zeit von mir dieses Schreiben) Ich würde gerne wissen, was Ihre Entscheidung war und wie es für Sie stellte sich heraus, wenn Sie ging voran mit der Umsetzung.

Andere Tipps

Ich bin einer der Schöpfer und Maintainer von JUNG, so trägt, dass im Auge für die Antworten unten.

Zunächst aber soll ich sagen, dass der Autor von Prefuse ein Freund eines Freundes ist (und ja, wir haben getroffen), und er hat einen tollen Job gemacht. Ich bin nicht mit Prefuse erlebt, aber ich habe einige schöne Visualisierungen mit ihm erstellt gesehen.

Hier sind die Antworten auf diese Fragen für JUNG. Mehrere von ihnen ((1), (2), (4) sind in PluggableRendererDemo gezeigt:

  1. Unterstützte (Sie werden die richtige Datenmodell müssen nicht alle Unterstützung parallelen Kanten aus Performance-Gründen)
  2. Unterstützung (auch hier müssen Sie das richtige Datenmodell)
  3. Unterstützt (siehe ImageShaperDemo)
  4. Unterstützte (die meisten Demos)
  5. Unterstützt (siehe GraphEditorDemo)
  6. Nicht direkt unterstützt, obwohl Sie sicherlich Etiketten dynamisch und HTML Verwendung ändern können komplexe Etiketten zu machen.
  7. JUNG Layout-Algorithmen sind für allgemeine Netze (mit wenigen Ausnahmen für Bäume, etc.). Sie können Ihre eigenen Layout-Algorithmen sicher konstruieren, aber, und viele von ihnen haben dies auch getan.

Hope, das hilft.

Ich weiß, dass Sie angegeben jung und prefuse aber ... Ich habe mit beiden TomSawyer und yFiles gute Erfahrungen gemacht. Die Anforderungen Liste Ihnen vorgeschlagen ist sehr einfach auf diese beiden -. Und unterstützen sie viel mehr

Ran.

Ich würde vorschlagen, dass die Bewertung JGraph zu.

Ich mag @ holygeek Antwort. Hier ist meine Implementierung der Lösung für 2 (beide gerichteten und ungerichteten Kanten), für Prefuse:

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;
    }
}

... an anderer Stelle, wo der Graph erstellt ...

MyRenderFactory.EdgeDirected directedness =
        MyRenderFactory.EdgeDirected.fromIsDirected(myEdge.isDirected());
prefuseEdge.set(MyRenderFactory.directedness, directedness);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top