Using iGraph, how can I represent self-reflexive nodes with circle shaped curves? By default, these curves are represented by a pinched or tear drop shaped loop.
2 Answers
As Spacedman said, you would need to do quite some programming to do this. You could plot a graph without self-loops and then add them (graphs are basically a scatterplot and you can use points
and similar functions to add lines to them), but this is not trivial (especially since you need to know the edge of nodes, not their center) and will cause the selfloops to be plotted on top of everything else which might not look good.
This weekend I have updated qgraph
with how self-loops work. qgraph
can be used to plot networks and should play nicely with igraph
. e.g.:
# An adjacency matrix:
A <- matrix(1,3,3)
library("igraph")
# igraph graph and layout:
Graph <- graph.adjacency(A)
Layout <- layout.circle(Graph)
# Plot in qgraph:
library("qgraph")
qgraph(get.adjacency(Graph,sparse=FALSE),layout=Layout,diag=TRUE,directed=TRUE)
I am quite content with how these self-loops turned out and they seem to be more to what you describe. So this could be an option. However, my loops are just as hardcoded. For reference, I compute the edge of a node (starting and ending point of the loop) with the inner function qgraph:::Cent2Edge
and compute the shape of the loop (spline) with the inner function qgraph:::SelfLoop
.

- 46,463
- 20
- 113
- 131
-
What's the parameter that tells qgraph to draw straight lines or splines? – skan Nov 19 '17 at 11:58
Inside plot.igraph
you can see that loops are drawn using a plot.bezier
function, and all the control for that is pretty much hard coded there. You'd have to rewrite large chunks of plot.igraph
to call a plot.circle
function you'd have to write to do this.
Also, I'm guessing you don't want complete circles, but circle segments that start on the edge of the vertex symbol (the default blue circle with the vertex number in it) and end (possibly with an arrowhead) on another part of the edge of the vertex symbol? Or do you want circles that touch the symbol like the bezier teardrop loops do?
Either way, the answer seems to be 'no, not without doing some programming or submitting a feature request to the igraph guys'
I posted an earlier answer saying the layout functions were involved, but that's not true - the layout functions only position the vertices, and it is plot.igraph's job to draw the edges.

- 92,590
- 12
- 140
- 224
-
The place of submitting a feature request is here: https://bugs.launchpad.net/igraph/+bugs – Gabor Csardi Sep 21 '12 at 14:02