来自GraphPlot图形的顶点坐标规则和顶点列表

是否有任何方法将GraphPlot应用于由GraphPlot生成的图形的(FullForm或InputForm)应用于VertexCoordinate Rules的顶点顺序? 我不想使用GraphUtilities函数VertexList。 我也知道GraphCoordinates,但是这两个函数都可以与图形一起使用,而不是GraphPlot的图形输出。

例如,

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})

给出以下六个坐标对的列表:

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

我如何知道哪条规则适用于哪个顶点,并且我可以确定这与VertexList [gr1]给出的规则相同?

例如

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

    VertexList[gr2]

给出{1,2,3,4,5}

但是......

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

给出六个坐标集:

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

例如,我如何为gr2提取VertexCoordinateRules的正确VertexList?

(例如,我知道我可以通过在生成gr2后生成VertexList来纠正这些问题)

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

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

但我需要的信息似乎存在于GraphPlot图形中:我如何获取它?

(我将图转换成邻接矩阵的原因,正如Wolfram的Carl Woll所指出的,它允许我包含一个'孤立'节点,就像在gp2中一样)


使用顶点标签,一种方法是获取标签的坐标。 请注意,GraphPlot的输出位于GraphicsComplex中,坐标别名的坐标是第一个标签,您可以将其作为第一个标签

points = Cases[gp1, GraphicsComplex[points_, __] :> points, Infinity] // First

FullForm你会看到标签在文本对象中,将它们解压为

labels = Cases[gp1, Text[___], Infinity]

实际的标签似乎是两层深,所以你会得到

actualLabels = labels[[All, 1, 1]];

坐标别名是第二个参数,因此您可以将它们设为

 coordAliases = labels[[All, 2]]

实际坐标在GraphicsComplex中指定,因此我们将它们设为

 actualCoords = points[[coordAliases]]

坐标列表和标签列表之间存在1-1对应关系,因此您可以使用Thread将它们返回为“标签” - >坐标对的列表。

这是所有这些功能

getLabelCoordinateMap[gp1_] := 
 Module[{points, labels, actualLabels, coordAliases, actualCoords},
  points = 
   Cases[gp1, GraphicsComplex[points_, __] :> points, Infinity] // 
    First;
  labels = Cases[gp1, Text[___], Infinity];
  actualLabels = labels[[All, 1, 1]];
  coordAliases = labels[[All, 2]];
  actualCoords = points[[coordAliases]];
  Thread[actualLabels -> actualCoords]
  ];
getLabelCoordinateMap[gp1]

不是这只适用于标记的GraphPlot。 对于没有标签的人可以尝试从其他图形对象中提取,但是根据您从中提取映射的对象,您可能会得到不同的结果,因为似乎有时会将线端点和顶点标签分配给不同的顶点。 我已经报道过了。 解决该问题的方法是始终对VertexCoordinateList使用明确的顶点 - >坐标规范,或始终使用“邻接矩阵”表示法。 这是一个差异的例子

graphName = {"Grid", {3, 3}};
gp1 = GraphPlot[Rule @@@ GraphData[graphName, "EdgeIndices"], 
  VertexCoordinateRules -> GraphData[graphName, "VertexCoordinates"], 
  VertexLabeling -> True]
gp2 = GraphPlot[GraphData[graphName, "AdjacencyMatrix"], 
  VertexCoordinateRules -> GraphData[graphName, "VertexCoordinates"], 
  VertexLabeling -> True]

顺便说一句,下面是用于在邻接矩阵和边缘规则表示之间进行转换的实用函数

edges2mat[edges_] := Module[{a, nodes, mat, n},
   (* custom flatten to allow edges be lists *)

   nodes = Sequence @@@ edges // Union // Sort;
   nodeMap = (# -> (Position[nodes, #] // Flatten // First)) & /@ 
     nodes;
   n = Length[nodes];
   mat = (({#1, #2} -> 1) & @@@ (edges /. nodeMap)) // 
     SparseArray[#, {n, n}] &
   ];
mat2edges[mat_List] := Rule @@@ Position[mat, 1];
mat2edges[mat_SparseArray] := 
 Rule @@@ (ArrayRules[mat][[All, 1]] // Most)

如果你执行FullForm[gp1]你会得到一堆输出,我不会在这里发布。 在输出开始附近,您会看到一个GraphicsComplex[] 。 这实质上是一个点列表,然后是这些点的使用列表。 因此,对于图形gp1 ,GraphicsComplex的开头是:

GraphicsComplex[
 List[List[2., 0.866025], List[1.5, 1.73205], List[0.5, 1.73205], 
  List[0., 0.866025], List[0.5, 1.3469*10^-10], List[1.5, 0.]], 
 List[List[RGBColor[0.5, 0., 0.], 
   Line[List[List[1, 2], List[2, 3], List[3, 4], List[4, 5], 
     List[5, 6], List[6, 1]]]],

第一个最外面的列表定义了6个点的位置。 第二个最外层列表使用第一个列表中的点数来定义这些点之间的一串线。 如果你玩弄这个,可能会更容易理解。

编辑:回应OP的评论,如果我执行:

FullForm[GraphPlot[{3 -> 4, 4 -> 5, 5 -> 6, 6 -> 3}]]

我明白了

    Graphics[Annotation[GraphicsComplex[List[List[0.`,0.9997532360813222`],
List[0.9993931236462025`,1.0258160108662504`],List[1.0286626995939243`,
0.026431169015735057`],List[0.02872413637035287`,0.`]],List[List[RGBColor[0.5`,0.`,0.`],
Line[List[List[1,2],List[2,3],List[3,4],List[4,1]]]],List[RGBColor[0,0,0.7`],
Tooltip[Point[1],3],Tooltip[Point[2],4],Tooltip[Point[3],5],Tooltip[Point[4],6]]],
List[]],Rule[VertexCoordinateRules,List[List[0.`,0.9997532360813222`],
List[0.9993931236462025`,1.0258160108662504`],
List[1.0286626995939243`,0.026431169015735057`],List[0.02872413637035287`,0.`]]]],
Rule[FrameTicks,None],Rule[PlotRange,All],Rule[PlotRangePadding,Scaled[0.1`]],
Rule[AspectRatio,Automatic]]

顶点位置列表是GraphicsComplex中的第一个列表。 稍后在FullForm中,您可以看到Mathematica添加工具提示的列表,用您在原始边缘列表中提供的标识符标记顶点。 既然你现在看的是描述图形的代码,你的顶点和将要绘制的内容之间只有一个间接关系; 信息都在那里,但并不完全直接解开。

链接地址: http://www.djcxy.com/p/20245.html

上一篇: VertexCoordinate Rules and VertexList from GraphPlot Graphic

下一篇: Dotted edges in GraphPlot/GraphPlot3D