gpt4 book ai didi

wolfram-mathematica - GraphPlot 图形中的 VertexCoordinate Rules 和 VertexList

转载 作者:行者123 更新时间:2023-12-04 17:40:51 26 4
gpt4 key购买 nike

有没有办法从GraphPlot生成的图形的(FullForm或InputForm)中抽象出GraphPlot适用于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)

alt text

最佳答案

对于顶点标记,一种方法是获取标签的坐标。请注意,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 使用显式的 vertex->coordinate 规范,或者始终使用“邻接矩阵”表示。这是一个差异的例子
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)

关于wolfram-mathematica - GraphPlot 图形中的 VertexCoordinate Rules 和 VertexList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4245946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com