pydot: ist es möglich, zwei verschiedene Knoten mit der gleichen Zeichenfolge in ihnen zu plotten?

8

Ich benutze pydot, um Graphen in Python zu zeichnen. Ich möchte einen Entscheidungsbaum darstellen, sagen etwas wie (a1, a2, a3 sind Attribute und zwei Klassen sind 0 und 1:

%Vor%

Allerdings werden mit pydot nur zwei Blätter erzeugt und der Baum sieht so aus (png angehängt):

%Vor%

Nun, in diesem einfachen Fall ist die Logik in Ordnung, aber in größeren Bäumen sind unordentliche interne Knoten, die zu verschiedenen Zweigen gehören, vereinheitlicht.

Der einfache Code, den ich benutze ist:

%Vor%

Ich habe auch versucht, verschiedene Knotenobjekte zu erstellen, als die Kanten zu erstellen und sie dann dem Diagramm hinzuzufügen, aber es scheint, dass pydot den Knotenpool nach Knoten mit demselben Namen prüft, anstatt einen neuen zu erstellen.

Irgendwelche Ideen? Danke!

    
ScienceFriction 22.10.2012, 13:36
quelle

2 Antworten

13

Ihre Knoten benötigen immer eindeutige Namen, andernfalls können Sie sie nicht eindeutig benennen, um Kanten zwischen ihnen anzuhängen. Sie können jedoch jedem Knoten eine Beschriftung geben, die beim Rendern angezeigt wird.

Sie müssen also Knoten mit eindeutigen IDs hinzufügen:

%Vor%

fügen Sie dann Grafikkanten hinzu, die diese Knoten verbinden:

%Vor%

Zusammen mit den übrigen Kanten, die Sie definiert haben, ergibt dies:

    
Martijn Pieters 22.10.2012, 13:55
quelle
1

Die "kanonische" Antwort besteht darin, das uuid -Modul der Standardbibliothek zu verwenden networkx macht hier .

Dies ist besser als id , um Knotennamen für pydot that zu erstellen entsprechen den Knoten in Ihrem ursprünglichen Diagramm, denn wenn (theoretisch) ein Knotenobjekt gelöscht wird, während Sie Ihr pydot Diagramm erstellen, dann ist das id nicht unbedingt eindeutig. Im Gegensatz dazu sind die erstellten UUID -Objekte einzigartig, persistent und unabhängig von der Lebensdauer der ursprünglichen Knoten.

Damit dies geschieht, muss jedoch etwas sehr Seltsames passieren, während Sie das pydot Diagramm erstellen, was ziemlich unwahrscheinlich ist. Der Vorteil der Verwendung von id besteht darin, dass Sie keine Zuordnung von ursprünglichen Knoten zu UUID -Objekten erstellen und weitergeben müssen (so dass Sie die Kanten nach dem Hinzufügen der Knoten konsistent erstellen).

Ein interessanter Fall sind verschachtelte Graphen: zwei verschiedene Graphen können das gleiche hashbare Objekt in networkx enthalten (zB a ), dann kann id nicht mehr direkt auf dem Knoten verwendet werden. In diesem Fall kann id dennoch verwendet werden, indem das Paar (Knoten, Graph) wie folgt kombiniert wird: str(id(node)) + str(id(graph)) .

    
Ioannis Filippidis 10.09.2014 02:13
quelle

Tags und Links