Hier ist ein weiterer Ansatz, der auf IGRAPH. Es ist inspiriert von dieser Inschrift code sample.
Ich gehe davon aus, dass die Verwendung IGRAPH statt diagrammer eine Option ist - vielleicht ist das nicht der Fall ...
Wir verlassen Positionierung der Eckpunkte zu einem Standard-Layout-Algorithmus und Abfrage es für die daraus entstehenden Eckpunktpositionen . Diese Positionen werden dann verwendet, um ein gepunktetes Rechteck um eine beliebige Menge von "ausgewählten" Ecken zu zeichnen. Es ist keine Benutzerinteraktion erforderlich.
Wir beginnen mit der Diagrammtopologie.
library(igraph)
set.seed(42)
df <- data.frame(from = c('A', 'B', 'I', 'D', 'D', 'E', 'E', 'F', 'F', 'G'),
to = c('B', 'C', 'I', 'E', 'F', 'G', 'F', 'H', 'G', 'H'))
g <- graph.data.frame(df, directed = TRUE)
Die Größe der Scheitelpunkte und Pfeile in der Grafik kann frei eingestellt werden, je nach Geschmack.
vertexsize <- 50
arrowsize <- 0.2
Wir bitten die Fruchterman-Reingold-Layout-Engine, die Koordinaten der Scheitelpunkte zu berechnen.
coords <- layout_with_fr(g)
Dann plotten Sie die Grafik.
plot(g,
layout = coords,
vertex.size = vertexsize,
edge.arrow.size = arrowsize,
rescale = FALSE,
xlim = range(coords[,1]),
ylim = range(coords[,2]))
Wenn wir sehen wollen, was los ist, können wir Achsen hinzufügen koordinieren und den Scheitelpunkt drucken Koordinaten:
axis(1)
axis(2)
V(g) # ordered vertex list
coords # coordinates of the vertices (in the same coordinate system as our dotted rectangle)
Wir haben jetzt den Begrenzungsrahmen der Eckpunkte herausfinden, dass wir ein Rechteck um wollen .
selectedVertices = c("A", "B", "C")
vertexIndices <- sapply(selectedVertices, FUN = function(x) { return(as.numeric(V(g)[x])) })
llx <- min(coords[vertexIndices, 1])
lly <- min(coords[vertexIndices, 2])
urx <- max(coords[vertexIndices, 1])
ury <- max(coords[vertexIndices, 2])
Fast da.Wir haben bereits die Koordinaten der Ecke Zentren in coords [], aber wir brauchen auch die Größe der Vertices im Koordinatensystem von plot(). Aus dem Quelltext von plot.igraph können wir sehen, dass die Option vertex.size für plot() durch 200 geteilt und dann als Radius zum Zeichnen des Scheitelpunkts verwendet wird. Wir verwenden einen um 50% größeren Wert als den Rand um die Begrenzungsbox der Vertex-Koordinaten, wenn das gepunktete Rechteck gezeichnet wird.
margin <- (vertexsize/200) * 1.5
rect(llx - margin, lly - margin, urx + margin, ury + margin, lty = 'dotted')
Dies ist das Ergebnis erhalten wir:
tun Sie es wollen – rawr
@rawr ein Widget oder einfach nur ein Bild sein: Was ist der Unterschied? Am Ende muss ich ein Bild ausgeben, um es in ein Word-Dokument einzufügen. – histelheim
@histelheim Vielleicht könnten Sie versuchen, ein Rechteck manuell als Knoten zu positionieren, indem Sie 'engine =" neato "' (statt circo) und das 'pos'-Attribut verwenden:' a [pos = '-3,4!', Width = 3,5, Höhe = 0,5, Form = Rechteck, Label = ''] '. Werfen Sie einen Blick auf http://www.graphviz.org/content/attrs#dpos http://stackoverflow.com/questions/5343899/ und http://stackoverflow.com/questions/29208525/ –