Alternative für Graphviz mit besserer automatischer Knotenplatzierung für große Graphen?

In der Vergangenheit habe ich Graphviz verwendet, um Zeichnungen von Diagrammen zu erstellen. Es ist ein nettes Werkzeug für kleine Diagramme.

Aber leider ist Graphviz für große Grafiken wirklich scheiße:

  • Es kreuzte immer Kanten, die offensichtlich ohne Kreuz gezeichnet werden konnten.
  • Es überlagert verschiedene Texte und macht sie unlesbar.
  • Es hat kein wiederverwendbares Styling (wie CSS), und Sie müssen die gleichen Personalisierungen in Knoten und Kanten immer und immer wieder wiederholen.
  • Wenn der Benutzer möchte, sagen Sie einfach, die Positionen von zwei Knoten zu tauschen. Dazu ist es häufig erforderlich, die Quelldatei stark zu hacken und dabei möglicherweise nicht zusammenhängende Teile des Diagramms zu beschädigen.
  • Es ist sehr einfach, dass Graphviz, um kleine Änderungen an einer isolierten Stelle des Diagramms vorzunehmen, an anderer Stelle große Änderungen erzwingt, wodurch häufig Stunden der Arbeit ungültig werden, wenn versucht wird, es davon zu überzeugen, es richtig zu zeichnen.
  • Es verschwendet viel Platz in der Grafik und überfüllt gleichzeitig einige Stellen so sehr.
  • Manchmal bilden einige Kanten sehr gewundene Pfade, um den Quellknoten mit dem Zielknoten zu verbinden, mit seltsamen nutzlosen Kurven und vielen überlagerten seitlich verlaufenden Kanten.
  • Es verfügt über Lawineneffekte. Triviale Änderungen irgendwo im Diagramm können die Graphviz-Heuristik stören und zu einem völlig anderen Diagramm führen.
  • Viele Fehler...

Ich möchte etwas, das ich als Benutzer einfach tun kann:

  • Definieren Sie, was die Knoten sind, möglicherweise mit anzuwendendem Stil.
  • Sagen Sie, was die Kanten sind, möglicherweise mit Stil, der angewendet werden soll.

Und dann gibt das Programm:

  • Ein Graph mit der minimal möglichen Anzahl von Kreuzungen.
  • Ziemlich ausgerichtete Knoten sind gut.

Ich will nicht:

  • Fügen Sie der Eingabe viele Hacks hinzu, nur weil das Tool zu dumm ist, um zu erkennen, dass es zwei bestimmte Knoten austauschen könnte, um eine Kreuzung zu entfernen.
  • Kanten und Knoten müssen manuell positioniert werden.
  • Holen Sie sich Lawineneffekte.

Was könnte also ein guter Ersatz für Graphviz sein? Ich möchte wirklich, dass es kostenlos ist.

Hinweis: Ich kümmere mich nicht viel um das Format, in dem der Graph eingegeben werden sollte, solange ich eine Datei mit der Graphbeschreibung speichern und bearbeiten kann (unabhängig von der Sprache einer solchen Beschreibung). Es besteht also absolut keine Notwendigkeit, sich noch mit der Punktsprache oder ähnlichem zu befassen (tatsächlich würde ich meine Punktdateien sehr gerne vollständig wegwerfen, da es dort viel mehr Hacks gibt als die eigentliche Diagrammbeschreibung).

Sehen Sie, Leute, so stellen Sie hier eine Frage (und ich werde den graphviz really sucksKlappentext übersehen, weil Sie gute Arbeit leisten, um zu erklären, warum es "scheiße" ist).
Ein Kollege sagt, dass d3.js (die meisten) die Positionierung richtig macht. Offensichtlich hat es andere nicht so schöne Nebeneffekte, wie Browser-basiert und dynamisch (dh nicht jeder bekommt die gleiche Ausgabe), also ist es vielleicht nicht das, was Sie wollen.
Bevor ich Graphvis benutzte, habe ich mit Graph::Easy (und mit Graph) Graphen in Perl generiert. search.cpan.org/~tels/Graph-Easy/lib/Graph/Easy.pm Ich würde Graph oder Graph::Easy nicht empfehlen. Ich bin von ihnen weggegangen , um mein Perl-Programm eine Punktdatei als Zeichenfolge ausspucken und graphvis darauf ausführen zu lassen.
Laut weiteren Informationen eines Mitarbeiters ist graphviz ziemlich gut (ja, wir wissen, wie schlecht die Ausgabe sein kann, aber das Problem ist absolut nicht trivial) für den allgemeinen Fall. Wenn Sie bestimmte Annahmen treffen können (wie keine Zyklen), gibt es bessere Algorithmen, aber graphviz scheint sie auch zu bündeln (spielen Sie ein wenig mit seinen Optionen). Sie benötigen Clustering, und dies wird nur einfacher, wenn Sie Annahmen über die Eingabedaten verwenden können.
@mirabilos Glaub mir, ich habe schon viele Möglichkeiten ausprobiert (seit 2011). Wenn der Graph keinen Zyklus hätte, würde er zu einer Art Baum degenerieren und wäre leicht zu zeichnen. Mein Diagramm hat jedoch tatsächlich viele Zyklen und etwa 200 Knoten. Um das mit graphviz zu handhaben, musste ich das Diagramm in 12 unabhängige Unterdiagramme aufteilen und die Knoten wiederholen, die in mehr als einem Diagramm erscheinen. Außerdem musste ich viele unsichtbare Knoten, Kanten und Cluster hinzufügen. In meinen Graphen haben die Cluster wenig oder keine semantische Bedeutung, sie sind nur Hacks, um zu versuchen, Graphviz dazu zu zwingen, seine Arbeit richtig zu machen.
@Oxinabox, ja das ist traurig. Aber angesichts der großen Anzahl von Hacks in den Heuristiken, Tags und der Struktur von graphviz denke ich, dass ein Neustart von Null viel besser wäre als ein Fork.
Computational Science SE hat hier dieselbe Frage: scicomp.stackexchange.com/questions/3315/… . Neben GraphViz stehen mehrere Optionen zur Verfügung: Kostenlos * JavaScript InfoVis Toolkit * igraph - Paket für das R-Statistiksystem * zGrViewer * Große Graphbibliothek Unfrei * GraphInsight
Diese erfüllen nicht die Anforderungen des OP, da es zu manuell ist, aber für einige Benutzer ist Cupid ein gültiger Weg, um fortzufahren.
Können Sie ein Beispieldiagramm posten (oder einen Link zu diesem bereitstellen), das Sie gerne erstellen möchten?
@Sebastian Nun, ich habe die Firma, in der wir dieses Problem hatten, bereits verlassen. Aber vielleicht habe ich die Daten irgendwo in einer Sicherungsdatei.
Wenn Sie dies tun, posten Sie es bitte nicht hier, um sich nicht in rechtliche Schwierigkeiten zu bringen. Sie sollten keine Daten haben, die einem Unternehmen gehören, das Sie verlassen haben.

Antworten (5)

Sorry für die Enttäuschung. Graphviz könnte in vielerlei Hinsicht besser sein, aber derzeit sind die Aussichten dafür nicht besonders gut, da AT&T die Arbeit nicht mehr so ​​sehr unterstützt wie in der Vergangenheit und einige der Autoren (wie ich) gegangen sind, um sich nach anderen umzusehen Arbeit. Wir suchen Leute, die das übernehmen wollen, also lass es uns wissen.

Wir sind auch von yFiles beeindruckt .

Probieren Sie auch Tom Sawyer Software aus ; Sie haben viel technisches Talent und haben viel an fortschrittlichen Layoutmethoden und interaktiven Tools gearbeitet. (Möglicherweise müssen Sie $$$ ausgeben, da die kostenlose Testversion anscheinend eingestellt wird.)

In der Frage wurde nicht angegeben, welches spezifische Layout-Tool oder welche Optionen ausprobiert wurden oder wie groß ein "großes" Netzwerk ist, daher ist nicht klar, was vorgeschlagen werden soll.

Wenn "groß" vielleicht Hunderte von Knoten bedeutet, versuchen Sie es neato -Goverlap=false(um eine Überlappung der Knotentextbeschriftung zu vermeiden) und -Gmodel=subsetversuchen Sie möglicherweise ein besseres Clustering. (Diese Optionen sind nicht die Standardeinstellung, da bei der Datenanalyse, z. B. in der Bioinformatik, eine direkte MDS-Einbettung eine genauere Wiedergabe von Entfernungen im zugrunde liegenden Netzwerk ergibt.)

Wenn "groß" Tausende von Knoten bedeutet, vielleicht viele Tausend, verwenden Sie sfdpstatt neatowieder -Goverlap=false. (Das Subset Distance Model ist in sfdp nicht verfügbar, da nicht klar ist, wie mit variablen Kantenlängen beim Zusammenführen von Kanten in einem hierarchischen Solver umgegangen werden soll.) Hier sehen Sie ein gutes Beispiel für ein Diagramm mit 1054 Knoten

Für "Platzverschwendungsprobleme" bei nicht angeschlossenen Komponenten siehe auch die Attribute pack und packmode. Die Lösungen für solche Probleme sind nicht offensichtlich (im Grunde versuchen Sie, unregelmäßige Formen optimal zu packen, mit zusätzlichen Einschränkungen und manchmal in der Größenordnung dessen, was die Leute als "groß" betrachten, sodass subquadratische Algorithmen erforderlich sind.) Experimentieren Sie mit verbundenen Graphen mit -Goverlap-Optionen.

Das sind die Vorschläge. Was Ausreden und Erklärungen angeht...

Was jemand den "Avalanche-Effekt" nennt, wird auch als Layout-Instabilität in Bezug auf (geringfügige) Änderungen im Eingabegraphen bezeichnet. Dies ist eine Eigenschaft von fast allen Batch-Graph-Layout-Programmen und Constraint-Solvern. Sie sollten also nach interaktiven Tools wie dem D3-Spring-Embedder-Layout suchen, und Tim Dwyer hat viel großartige Arbeit daran geleistet, als er bei Microsoft war. Vielleicht wird ihr Graph Layout Toolkit (AGL) eines Tages seine interaktiven Constraint-Methoden übernehmen. Nur eine Beobachtung, die meisten Forscher und Programmierer haben nicht versucht, Skalierung, Interaktivität und Ästhetik gleichzeitig anzugreifen (wählen Sie zwei der oben genannten ...)

Das Styling-Problem ist auch gut, wir hatten einfach keine Zeit/Energie, um es anzugehen, da die meisten Diagramme automatisch generiert werden, sodass Sie Stile in einem Vorverarbeitungstool oder Skript anwenden könnten. Außerdem muss berücksichtigt werden, dass der Graph nicht nur ein statischer Parse-Baum ist, sondern nachdem ein Graph gelesen wurde, sein Stylesheet oder die Attribute von Objekten, auf die die Stile angewendet wurden, geändert werden können, und dann der Graph geschrieben werden muss so korrekt, dass die ursprüngliche Struktur noch so weit wie möglich erhalten bleibt. Nicht unüberwindbar, aber das sind Details, die sorgfältig durchdacht werden müssen.

Bugs können auf www.graphviz.org unter Bug and Issue Tracking gemeldet werden.

Globales Kantenrouting mit glatten Kurven - schwieriges Problem. Beachten Sie, dass viele cool aussehende Layouts einiger anderer Tools gekrümmte Kanten verwenden, aber sie zeichnen einfach alles andere, was im Weg ist. Ich denke, wir haben diese Funktion auch zu Graphviz hinzugefügt. Ich glaube auch, dass es ein CHI- oder INFOVIS-Papier gab, das zeigt, dass solche gekrümmten Kanten tatsächlich etwas schwieriger richtig zu lesen sind als gerade Linien.

Kreuzungen - einige lokale Optimierungen könnten möglich sein. Nicht sicher, welches Tool verwendet wird. Es ist einfach, auf konkrete Beispiele hinzuweisen, bei denen Layouts besser sein könnten, aber schwieriger, eine effektive Lösung zu erfinden, bei der eine „Mindestanzahl von Kreuzungen“ die Dinge im Allgemeinen nicht wirklich verschlechtern würde.

Beachten Sie, dass ich direkt mit Graphviz verbunden bin.

Ich habe hochgestimmt. Stephen North ist ein anerkannter Experte für Graphenvisualisierung, und angesichts des Bashings von Graphviz durch das OP ist es wertvoll, seine Einsicht als Antwort zu haben. (Ich verstehe zwar die Frustration des OP, aber das Erstellen von Grafiken ist ein schwieriges Problem.)

Meine Software-Empfehlung ist " yEd " - eine kostenlose Allzweckanwendung zum Zeichnen von Graphen, die sich sehr bemüht, die Probleme zu lösen, auf die Sie gestoßen sind. Nach meinem besten Wissen verwendet diese Software die besten frei verfügbaren Implementierungen der Layoutalgorithmen.

Nun zur ausführlicheren Antwort, die eher für StackOverflow als für "Software Recommendation" geeignet wäre:

Das Problem, das Sie zu lösen versuchen, ist ein wirklich schwieriges Problem (insbesondere im Sinne von rechenintensiv ), daher ist es unwahrscheinlich, dass Sie ein Tool finden, das alle Ihre Probleme gleich gut lösen kann. Es gibt eine Reihe kostenloser Lösungen (GraphViz ist wahrscheinlich eine der besten) und eine ganze Reihe kommerzieller Konkurrenten. Für die kommerzielle Grafikzeichnungsbibliothek yFiles steht eine kostenlose (wie in Bier) plattformübergreifende Anwendung zur Verfügung, die Sie ausprobieren können. Es kann Daten aus verschiedenen Formaten importieren, Style-Mappings auf Ihre Daten anwenden und bietet eine riesige Sammlung verschiedener Layout-Algorithmen. Es heißt yEd und kann von hier aus ohne Installation in einer Webversion ausgeführt werden. Die Desktop-Version kann als Java-„Webstart“-Anwendung direkt aus dem Browser oder nach der Installation eines der eigenständigen Programme für Windows, Linux und Mac gestartet werden.

Einige der Layoutalgorithmen sollten wahrscheinlich nicht mit sehr großen Graphen (Zehntausende von Elementen) verwendet werden, da sie sehr lange ausgeführt werden oder zu viel Speicher benötigen, aber meistens gibt es mindestens einen Layoutstil, der dies tut sollte gut zu Ihren Daten passen. Wenn Sie gegen die API programmieren müssen, müssten Sie die zugrunde liegende Bibliothek (verfügbar für Java, .net, Javascript) lizenzieren, was gegen Ihre "kostenlose" Anforderung verstößt, aber dies würde Ihnen noch mehr Kontrolle über das Layout geben.

Haftungsausschluss : Ich arbeite für das Unternehmen, das dieses (kostenlose) Produkt herstellt, vertrete jedoch nicht meinen Arbeitgeber auf Stack Exchange. Ich habe seit den späten 1990er Jahren den größten Teil meiner akademischen und beruflichen Zeit mit Diagrammzeichnungssoftware verbracht, und ich glaube, ich habe sehr fundierte Kenntnisse über den Markt und die verfügbare Software (sowohl kostenlose als auch kommerzielle). Möglicherweise sind andere Tools verfügbar, und ich hoffe, dass diese Website großartige Alternativen aufzeigen kann - ich werde sie sicherlich nicht leugnen.

+1. Die OP-Anforderung ist unmöglich (das Programm gibt einen Graphen mit der minimal möglichen Anzahl von Kreuzungen aus, für einen großen Graphen --> NP-hart, also viel Glück). Diese Antwort ist Expertenqualität.
Ich habe auch hochgestimmt. Wenn es jemals einen Ort gab, an dem Sie Experten zu Rate ziehen sollten, dann bei schwierigen Problemen, und das ist besonders schön, von Experten zu hören, wenn es darum geht, Software zu bekommen.
Um von GraphViz ( .dot) in ein Format zu konvertieren, das yEd lesen kann, verwenden Sie dottoxml .
Als unabhängiger Benutzer von yEd (nicht mit dem Unternehmen verbunden) bestätige ich, dass yEd die beste kostenlose Software ist, die es gibt (und ich habe viele ausprobiert)

Um sehr spezifisch auf die Anfrage der Frage zu antworten, da die anderen beiden Antworten großartige Arbeit geleistet haben, um sich zu erweitern:

Was Sie verlangen, ist nicht möglich. Sie möchten ein Programm, das einen "Graphen mit der minimal möglichen Anzahl von Kreuzungen" liefert, und Sie haben ausdrücklich darum gebeten, dass das Programm für große Graphen funktioniert.

Die Bestimmung der Kreuzungszahl eines Graphen ist jedoch ein NP-schweres Problem (Garey und Johnson haben 1983 gezeigt , dass es NP-vollständig ist).

Daher kann ein solches Programm nicht garantieren, den Graphen mit der minimal möglichen Anzahl von Kreuzungen in einer angemessenen Zeit zu finden, was das Programm unbrauchbar macht.

Es kann eine "ziemlich kleine" Anzahl von Kreuzungen geben, nicht unbedingt ein globales Minimum.

Dies würde sicherlich als "GraphViz-basierte Lösung" angesehen werden, aber wenn Sie mit GraphViz arbeiten, sollten Sie sich Gephi ansehen . Es ist weitaus leistungsfähiger, wenn es um die Verarbeitung großer Diagramme geht.

PlantUML ist ein Open-Source-Tool, mit dem Benutzer UML-Diagramme aus einer einfachen Textsprache erstellen können. Die Sprache von PlantUML ist ein Beispiel für eine anwendungsspezifische Sprache. Es verwendet die Graphviz-Software, um seine Diagramme zu erstellen. Es wurde verwendet, um blinden Studenten zu ermöglichen, mit UML zu arbeiten. PlantUML hilft auch blinden Softwareentwicklern, UML-Diagramme zu entwerfen und zu lesen.

Geben Sie hier die Bildbeschreibung ein

Sorry, aber das ist überhaupt nicht hilfreich. Der Autor fordert ausdrücklich eine Software, die die Probleme besser löst als GraphViz. Dies schließt also offensichtlich GraphViz-basierte Lösungen aus. Und UML-Diagramme sind sicherlich auch nicht die typischen Anwendungen für "große Graphen". Wollten Sie eine andere Frage beantworten?