I'd like to draw something like the following graph:
testGraph = Graph[{1 \[UndirectedEdge] 2, 1 \[UndirectedEdge] 4,
2 \[UndirectedEdge] 3, 2 \[UndirectedEdge] 5,
3 \[UndirectedEdge] 4},
VertexLabels -> {1 -> "1", 2 -> "2", 3 -> "3", 4 -> "4", 5 -> "5"},
VertexCoordinates -> {{0, 0}, {1, 1}, {2, 3}, {4, 1}, {3, 3}},
ImagePadding -> 10]
However, without changing any of the explicitly specified vertex positions, I'd like edges to curve to avoid vertices. For example, while it's fine that the edges between vertices 2 and 5, and 3 and 4 cross, what if I have an edge between vertices 1 & 5 (if I actually do this, Mathematica v9 appears to no longer respect my vertex coordinates) and what if I would like this edge not to pass through a small sphere about vertex 2?
Is there any way to enforce vertex positionings while allowing for curved edges that avoid vertices in Mathematica v9? This is a dream, however, could I specify a length for an edge and have it travel along an arc to meet that length requirement provided stationary vertices?
A hack would involve creating a set of edges between "invisible" vertices, however, it would take a lot of invisible vertices to create an appropriate curvature effect, and this doesn't seem like the right thing to do.
Answer
quick fix is to use EdgeShapeFunction
. My function here is not very sophisticated so it may happen that you cross different vertices somewhere some day, so be careful :) :
Graph[{1 \[UndirectedEdge] 2, 1 \[UndirectedEdge] 4, 2 \[UndirectedEdge] 3,
2 \[UndirectedEdge] 5, 1 \[UndirectedEdge] 5, 3 \[UndirectedEdge] 4},
VertexLabels -> {1 -> "1", 2 -> "2", 3 -> "3", 4 -> "4", 5 -> "5"},
VertexCoordinates -> {{0, 0}, {1, 1}, {2, 3}, {4, 1}, {3, 3}},
ImagePadding -> 10,
EdgeShapeFunction -> (BezierCurve[
{#, # + .5 RotationMatrix[.3].(#2 - #), #2} & @@ #] &)]
Comments
Post a Comment