Ich bin Medizinstudent im ersten Studienjahr und möchte mit Graphviz eine einfach zu interpretierende Grafik der menschlichen Anatomie und ihrer funktionellen Beziehungen erstellen. Insbesondere möchte ich ein Diagramm mit etwa 50 Muskeln, 50 Nerven, 50 Arterien, 80 Knochen und Knochenprozessen erstellen, die proximalen und distalen Ansatzpunkte für Muskeln auf Knochenprozesse, welche Nerven innervieren welche Muskeln, welche Arterien perfundieren welche Muskeln, et. al.
Für ein umfassendes Bild, das all diese Strukturen und all ihre Beziehungen darstellt (was sehr komplex sein wird, weiß ich), halte ich ein Diagramm für die beste Möglichkeit, diese Strukturen und ihre funktionalen Beziehungen darzustellen, und Graphviz scheint gut zu sein Software zum Erstellen solcher Graphen, aber es gibt verschiedene Arten von Kanten, die Strukturen verbinden. Zum Beispiel, basierend auf makroskopischer Beobachtung von groben Strukturen, scheint es, dass der N. axillaris von der hinteren Schnur des Plexus brachialis (BP) abstammt, die Fasern von den oberen, mittleren und unteren Stämmen des BP und diesen drei Stämmen enthält enthalten Nervenfasern von jedem der vorderen Rami, die ihren Ursprung in den Spinalnerven C5, C6, C7, C8 und T1 haben. Die elektrische Konnektivität des N. axillaris ist jedoch trotz physikalischer Erscheinungen so, dass sie tatsächlich Nervenfasern enthält, die ihren Ursprung in den vorderen Rami nur der Spinalnerven C5 und C6 haben (siehe Bild und ich sollte hier erklären, dass alle Nervenfasern von allen Spinalnerven sind) die gleiche Farbe in der tatsächlichen groben Anatomie, so versuchen Sie, das Bild ohne Farben vorzustellen, um eine Idee über die physischen Verbindungen gegen die elektrischen Verbindungen zu erhalten, wie in den Farben gezeigt). Um also die physische Konnektivität und die elektrische Konnektivität für den Nervus axillaris und alle ihm vorgeschalteten Nervenfasern genau darzustellen, brauche ich mindestens zwei verschiedene Arten von Kanten: "physische" Kanten und "elektrische" Kanten . Ich denke, Graphviz kann so etwas tun, aber ich bin neu in der Verwendung von Graphviz und bin mir nicht sicher, wie das am besten funktioniert (obwohl das hier nicht meine Hauptfrage ist).
Ich werde auch einen Weg finden müssen, Beziehungen wie die oben dargestellten darzustellen, wo Nervenfasern auf ihrem Weg zu namentlich genannten Nerven stromabwärts von diesen Strukturen mehrere Strukturen durchlaufen. Zum Beispiel wird in der obigen Abbildung die Farbe verwendet, um eine kontinuierliche Menge von Nervenfasern zu zeigen, die in C6 (blau) entstehen und sich zu allen folgenden Strukturen aufwickeln: "Nerve to subclavius", "Upper Trunk", "Lateral Cord "," Median Nerve "," Lateral Pectoralis "," Axillary Nerv "und" Radial Nerv ".
Ich habe versucht, einige davon mit Graphviz wie in der folgenden Abbildung darzustellen.
das habe ich mit Zeilen des DOT-Sprachcodes wie folgt erstellt (das ist ein unvollständiges Code-Snippet; nicht die gesamte DOT-Datei, die ich zum Erstellen dieses Bildes verwendet habe):
%Vor%Das Hauptproblem bei dieser Darstellung ist jedoch, dass zwischen C6 und dem oberen Rumpf des Plexus brachialis mehrere blaue Kanten vorhanden sind und zwischen C5 und dem oberen Rumpf des Plexus brachialis mehrere gelbe Ränder vorhanden sind und zwischen C7 und dem Oberarm mehrere orangefarbene Ränder vorhanden sind Plexus mittlerer Rumpf und es gibt mehrere orangefarbene Ränder zwischen dem mittleren Rumpf des Plexus brachialis und dem lateralen Kabel des Plexus brachialis.
Ich weiß, warum es mehrere Kanten derselben Farbe wie im obigen Absatz gibt. Ich habe sie explizit in der DOT-Datei erstellt. Und damit die Logik korrekt ist (ich kann diese DOT-Datei schließlich mit Python oder ähnlichem analysieren), möchte ich eigentlich, dass die DOT-Datei diese mehreren Kanten der gleichen Farbe enthält. Aber ich möchte nicht sehen mehrere Kanten derselben Farbe im gerenderten Bild.
Meine Hauptfrage lautet also: Wie bekomme ich Graphviz, um das Rendern der 5 blauen Kanten zwischen C6 und dem oberen (oberen) Stamm zu unterdrücken und sie stattdessen als nur eine blaue Kante rendern zu lassen?
Eine zweite Frage lautet: Wie erzwinge ich, dass Graphviz Kanten mit unterschiedlichen Farben so rendert, dass sie sich nicht überlappen, so dass jede unterschiedlich gefärbte Kante über den gesamten Bereich (vom Ursprungsknoten bis zum benachbarten Knoten) unterschiedlich ist ) Das beste Beispiel hierfür ist ein Problem in dem obigen Bild, das an den zwei (blauen und gelben) Kanten zu sehen ist, die den oberen (oberen) Rumpf mit dem hinteren Kabel verbinden. Obwohl sich die blauen und gelben Ränder in der Mitte der Spannweite in der Nähe der beiden Knoten unterscheiden, überlappen sie sich so vollständig, dass man kaum erkennen kann, dass dort zwei Kanten vorhanden sind. das Blau verdeckt das Gelb fast vollständig.Ich würde gerne einen allgemeinen Weg finden, Graphviz dazu zu zwingen, die blauen und gelben Kanten nicht zu überlappen (ich möchte das Bild nicht visuell überprüfen und die DOT-Datei korrigieren, sondern einen Weg finden) Sag Graphviz, dass Kanten überhaupt nicht überlappen dürfen, es sei denn, sie haben die gleiche Farbe).
Das vorherige Graphviz-Bild beginnt zu zeigen, warum diese Frage für mich wichtig ist, aber nachdem ich jetzt länger daran gearbeitet habe, zeigt das Bild unten es noch besser. Die Dinge werden so unordentlich, dass es schwer zu interpretieren ist.
@Simon danke für die Erklärung (in deinem Kommentar unten) über GNU head
. head
unter OS X verhält sich anders, also habe ich dein sed
script benutzt und das hat mein erstes Problem beseitigt. Ich denke jedoch, dass Ihr Skript removeDupEdge
möglicherweise andere Probleme mit meiner .gv
-Datei verursacht.
Um zu demonstrieren, beginne ich mit Ihrer Beispieldatei multiEdge.gv
. Einige kleine Änderungen vorzunehmen, habe ich:
Ihr removeDupEdge
-Skript scheint die Zwei-Zeichen-Zeilen oberhalb schlecht zu behandeln:
Und ich denke, das ist kein gültiger DOT-Sprachcode mehr. Ihr removeDupEdge
-Skript sieht für mich sehr vielversprechend aus, aber ich bin mir nicht sicher, wie ich es für das oben gezeigte Beispiel beheben kann. Meine .gv
-Datei ist mehr als 700 Zeilen, und ich verwende auch die C ++ - Style-Kommentare, die in der DOT-Sprachdokumentation erlaubt sind . Ich bin mir nicht sicher, ob Kommentare Probleme für Ihr removeDupEdge
Skript verursachen können.
(Stark bearbeitet, um den Prozess für Knoten und Kanten mit mehreren Attributen stabil zu machen)
In Bezug auf die erste Frage zeigt GraphViz, das Gruppieren derselben Kanten dies an Mit dem strict
-Schlüsselwort wird graphviz
nicht mehr zwischen mehreren Knoten angezeigt. Dadurch wird jedoch nicht eine Kante für jede Farbe zwischen zwei Knoten angezeigt. Der beste Weg, dies zu tun, wäre, soweit ich sehen kann, die graphviz
-Datei zu verarbeiten und dann anzuzeigen.
Beispiel: multiEdge.gv
:
... was wie folgt aussieht:
... wir können es mit folgendem removeDupEdge
script verarbeiten:
..., die zuerst eine Version des Skripts in kanonischer Form erzeugt, in der jede Kante nur zwischen zwei Knoten liegt. Leider fügt die kanonische Form auch Multi-Attributknoten- und Elementattributlisten auf mehrere Zeilen ein, die in Kommas enden, so dass der nächste Teil des Skripts perl
verwendet, um alle Zeilen, die in Kommas enden, erneut zu verknüpfen (dank einer Antwort auf Wie können Sie alle Zeilen kombinieren, die damit enden? ein Backslash-Zeichen? ). Das Skript speichert dann die oberen drei Zeilen und die untere Zeile des kanonischen Formulars als Kopf- bzw. Fußzeile, bevor alle außer den Kopf- und Fußzeilen übernommen werden, sie sortiert werden, nur die eindeutigen Zeilen beibehalten werden und dann die Kopf- und Fußzeile wieder verkettet werden Bilden Sie eine legale xdot
-Datei. Das Ergebnis ist wie folgt:
Wir können es dann mit anzeigen:
%Vor%... zu bekommen:
... welches nur eine Kopie jeder identischen Kante zeigt.
Das Skript könnte etwas robuster gemacht werden, indem sed 's/ */ /g'
vor sort
eingefügt wird, da sonst nicht signifikante Leerzeichen aus der Datei xdot
vor dem Sortieren und Vergleichen der Zeilen entfernt werden. Es würde jedoch auch mehrere Leerzeichen von (etwa) Knotenbeschriftungen entfernen, was möglicherweise nicht wünschenswert ist.
Bei Kommentaren in der ursprünglichen xdot
-Quelle verursacht dies kein Problem, weil sie durch den Kanonisierungsprozess entfernt werden.
Tags und Links graphviz