I'm wondering if anyone has implemented edge bundled graph plotting?
An important paper is "Force-Directed Edge Bundling for Graph Visualization" by Danny Holten and Jarke J. van Wijk.
I'm wondering if anyone has implemented edge bundled graph plotting?
An important paper is "Force-Directed Edge Bundling for Graph Visualization" by Danny Holten and Jarke J. van Wijk.
CommunityGraphPlot has this feature implemented internally:
g = ExampleData[{"NetworkGraph", "DolphinSocialNetwork"}]; CommunityGraphPlot[g] 
The information about bundling is calculated by CommunityGraphPlot (i.e. it is not supplied with the example data), though unfortunately there are no documented options available to finetune the bundling (but see below), only the region (CommunityRegionStyle) and boundary styles (CommunityBoundaryStyle).
Though one can extract from the community graph the BezierCurve that generates the bundled edges (with low opacity EdgeStyle by default), it will contain references to vertex coordinates like DynamicLocation["VertexID$1", Automatic, Center]. Unfortunate again that due to the dynamical nature of a CommunityGraphPlot, ordinary Graph functions like VertexList or PropertyValue[{g, 1}, VertexCoordinates] will fail, so there is no easy way to extract the real vertex coordinates which otherwise could have been matched with the various "VertexID$1" references.
The method to find communities can be customized with FindGraphCommunities.
You have to dig deep to ultimately find any bundling-related code in GraphComputation`GraphCommunitiesPlotDump`communitiesPlot. It accepts the following internal options (above default ones):
"EdgeLayout" -> Automatic "CommunityEdgeWeight" -> Automatic "CommunityRegionFunction" -> Automatic If "EdgeLayout" has the value "DividedEdgeBundling", the following suboptions are available to control the bundling process (with their defaults):
"CoulombConstant" -> 4.5 "VelocityDamping" -> 1 "SmoothEdge" -> True Examining its internal usage and a bit of experimentation yielded the following results:
SetProperty[g, {GraphLayout -> {"EdgeLayout" -> {"DividedEdgeBundling", "CoulombConstant" -> 5, "VelocityDamping" -> .6, "SmoothEdge" -> True}, "VertexLayout" -> {Automatic}}}] 
SetProperty[g, {GraphLayout -> {"EdgeLayout" -> {"DividedEdgeBundling", "CoulombConstant" -> 100, "VelocityDamping" -> .5, "SmoothEdge" -> False}}}] 
SetProperty[g, { GraphLayout -> {"EdgeLayout" -> {"DividedEdgeBundling", "CoulombConstant" -> 44, "VelocityDamping" -> .87, "SmoothEdge" -> False}}}] 
SetProperty[g, { GraphLayout -> {"EdgeLayout" -> {"DividedEdgeBundling", "CoulombConstant" -> 100, "VelocityDamping" -> .5, "SmoothEdge" -> False}, "VertexLayout" -> {"SpringEmbedding", "EdgeWeighted" -> True, "Multilevel" -> False}}}] 
For larger graphs it really helps to use transparent edges:
sm = SocialMediaData["Facebook", "FriendNetwork"]; { SetProperty[sm, {ImageSize -> 300, GraphLayout -> {"EdgeLayout" -> None}}], SetProperty[sm, {ImageSize -> 300, EdgeStyle -> [email protected], GraphLayout -> {"EdgeLayout" -> {"DividedEdgeBundling", "CoulombConstant" -> 500, "VelocityDamping" -> .5, "SmoothEdge" -> False}}}] } 
SetOptions[Graph, ...] or similar. You're missing vertex shapes as well. Is this the result when you start with a fresh kernel? $\endgroup$ {"NewForce","Connectivity","Compatibility","SmoothEdge","Threshold","SpringConstant","CoulombConstant","CoulombDecay","VelocityDamping","LaneWidth"}. $\endgroup$
GraphPlot. $\endgroup$