Search code examples
wolfram-mathematica

VertexCoordinate Rules and VertexList from GraphPlot Graphic


Is there any way of abstracting the vertex order that GraphPlot applies to VertexCoordinate Rules from the (FullForm or InputForm) of the graphic produced by GraphPlot? I do not want to use the GraphUtilities function VertexList. I am also aware of GraphCoordinates, but both of these functions work with the graph, NOT the graphics output of GraphPlot.

For example,

gr1 = {1 -> 2, 2 -> 3, 3 -> 4, 4 -> 5, 5 -> 6, 6 -> 1};
gp1 = GraphPlot[gr1, Method -> "CircularEmbedding", 
   VertexLabeling -> True];

Last@(gp1 /. Graphics[Annotation[x___], ___] :>  {x})

gives the following list of six coordinate pairs:

VertexCoordinateRules -> {{2., 0.866025}, {1.5, 1.73205}, {0.5, 1.73205}, {0., 0.866025}, {0.5, 1.3469*10^-10}, {1.5, 0.}}

How do I know which rule applies to which vertex, and can I be certain that this is the same as that given by VertexList[gr1]?

For example

 Needs["GraphUtilities`"];
gr2 = SparseArray@ 
      Map[# -> 1 &, EdgeList[{2 -> 3, 3 -> 4, 4 -> 5, 5 -> 6}]];

    VertexList[gr2]

gives {1, 2, 3, 4, 5}

But ....

    gp2 = GraphPlot[gr2, VertexLabeling -> True, 
      VertexCoordinateRules -> 
       Thread[VertexList[gr1] -> 
         Last@(gp1 /. Graphics[Annotation[x___], ___] :>  {x})[[2]]]];
Last@(gp2 /. Graphics[Annotation[x___], ___] :>  {x})

gives SIX coordinate sets:

VertexCoordinateRules -> {{2., 0.866025}, {1.5, 1.73205}, {0.5, 1.73205}, {0., 0.866025}, {0.5, 1.3469*10^-10}, {1.5, 0.}}

How can I abstract the correct VertexList for VertexCoordinateRules for gr2, for example?

(I am aware that I can correct things by taking the VertexList after generating gr2 as follows, for example)

VertexList@
 SparseArray[
  Map[# -> 1 &, EdgeList[{2 -> 3, 3 -> 4, 4 -> 5, 5 -> 6}]], {6, 6}]

{1, 2, 3, 4, 5, 6}

but the information I need appears to be present in the GraphPlot graphic: how can I obtain it?

(The reason I convert the graph to an adjacency matrix it that, as pointed out by Carl Woll of Wolfram, it allows me to include an 'orphan' node, as in gp2)

alt text


Solution

  • p2 = Normal@gp1 // Cases[#, Line[points__] :> points, Infinity] &;
    p3 = Flatten[p2, 1];
    ListLinePlot[p3[[All, 1 ;; 2]]]
    

    ListLinePlot

    V12.0.0