2012-03-27 2 views
1

Betrachten Sie eine Darstellung eines sehr einfachen ungerichteten Graphen, der mit igraph erzeugt wurde.Plot ungerichteter Grafik zeigt Lücken zwischen Kante und Scheitelpunkt an einem Ende der Kante

library(igraph) 

edges = matrix(c(1,2), nrow=1, ncol=2) 
g = graph.edgelist(edges, directed=FALSE) 
set.seed(42) 
plot(g, edge.width=2, vertex.size=30, edge.color='black', main='') 

Es gibt eine kleine Lücke zwischen dem Rand und Vertex-2, aber nicht zwischen dem Rand und Scheitel 1. Gibt es eine Möglichkeit, diese Lücke zu entfernen?

Die Graphik, mit der ich wirklich arbeite, ist größer und die Kanten sind viel kleiner . Während die Lücke im obigen Beispiel fast unbemerkt bleibt, ist es in meinem Fall verwirrend.

+0

Dies funktioniert für mich in Ordnung für mich. Ich weiß, dass das, was du beschreibst, eher passiert, wenn du versuchst, in einem nicht quadratischen Plotbereich zu plotten, aber ich weiß nicht mehr, wie du das tust. Verwandt, Sie könnten versuchen, mein Paket 'library (" qgraph "); qgraph (Kanten)', in dem dieses Verhalten nicht auftreten sollte. –

+1

Ich sehe das Problem unter Windows. Die Lücke wird größer, wenn das Fenster in der Größe geändert wird. Es ist eine sehr kleine Lücke in diesem Fall, aber ich schätze Ihre Bemühungen um Perfektion. Könnten Sie 'layout()' (die 'igraph' -Funktion) verwenden, um Koordinaten von Scheitelpunkten zurückzugeben, dann zeichnen Sie Ihr eigenes Diagramm von Grund auf neu. Plot Kanten zuerst dann Scheitelpunkte oben. – digitalmaps

+0

Könnte ein Fehler sein. Übrigens. Wenn Sie die Größe des Diagramms ändern, ist es am besten, es neu zu zeichnen, da die Neuskalierung möglicherweise Rundungsfehler vergrößert. Es ist am besten, wenn Sie unter https://bugs.launchpad.net/igraphen Fehler melden. –

Antwort

1

Dies ist in der Tat ein Fehler in igraph, und es passiert, weil igraph dort Platz für die Pfeilspitze lässt, auch wenn die Pfeilspitze nicht da ist. Ich werde es in der nächsten Version von igigraph korrigieren.

Als Workaround können Sie jede Kante zweimal übereinander auftragen. Dazu müssen Sie Ihren Graphen richten und dann die Option edge.arrow.mode verwenden, um die Pfeile zu vermeiden. Dies funktioniert, weil nur ein Ende der Kante vom Pfeilplotter verändert wird. Ein bisschen blöd, um deine Graphen auf diese Weise zu zeichnen, aber ich kann momentan keine bessere Lösung finden. Wie gesagt, die neue Version (die nach 0.6.4) wird dieses Problem nicht haben.

library(igraph) 

# Zoom in on the critical region, although the gap always has the 
# same size, unless you make the plotting window bigger 
g <- graph(c(1,2), directed=FALSE) 
par(mar=c(0,0,0,0)) 
plot(g, edge.width=2, vertex.size=20, edge.color='black', main='', 
    rescale=FALSE, xlim=c(0.9,1), ylim=c(0.9,1), 
    layout=rbind(c(0,0), c(1,1)), vertex.color="#ffffff11") 

gap

# This plot should have no gaps 
g2 <- as.directed(g, mode="mutual") 
par(mar=c(0,0,0,0)) 
plot(g2, edge.width=2, vertex.size=20, edge.color='black', main='', 
    rescale=FALSE, xlim=c(0.9,1), ylim=c(0.9,1), 
    layout=rbind(c(0,0), c(1,1)), vertex.color="#ffffff11", 
    edge.arrow.mode="-") 

no gap

+0

Danke für die Problemumgehung! Das funktioniert gut für mich! – severin

1

Ich las die ?igraph Seite und sah eine Empfehlung, das 'gut aussehende Anti-Aliased Cairo-Gerät' ?igraph zu verwenden.

Also habe ich versucht,

library(Cairo) 
Cairo(1600, 1600, file="plot.png", type="png", bg="white") 
plot(g, edge.width=2, vertex.size=30, edge.color='black', main='') 
dev.off() 

und

CairoPDF("plot.pdf", 6, 6, bg="transparent") 
plot(g, edge.width=2, vertex.size=30, edge.color='black', main='') 
dev.off() 

Sowohl die png und pdf-Version aussehen wie es ist keine kleine Lücke.

Lassen Sie mich wissen, ob es für Sie funktioniert.

+0

Danke, dass du das gezeigt hast! Ich habe es nicht ausprobiert, weil ich tatsächlich ein [tikz] (http://pgf.sourceforge.net/) Gerät verwende, das auch die Lücke produziert. – severin

+0

@severin, und von dem, was Sie schreiben, nehme ich an, Sie können die obige Lösung nicht verwenden, müssen aber die Tikz-Lösung verwenden? –

+0

aus irgendeinem Grund habe ich Ihre Frage im letzten Jahr verpasst. Es tut uns leid! Ja, leider muss ich das Tikz Gerät benutzen. – severin