繁体   English   中英

使用python、networkx、pygraphviz获取图形顶点的布局坐标

[英]Getting layout coordinates of graph vertices using python, networkx, pygraphviz

我想使用 NetworkX 创建一个图形,使用 Graphviz(通过 pygraphviz)布局图形。 我已经成功运行了NetworkX pygraphviz 示例文档中的所有示例

我的问题是 - 如何将顶点的坐标(x,y)和尺寸(宽度,高度)返回到 NetworkX 图中。 这就是目标。 我只想要 Graphviz 的布局功能,而不是绘图功能。 是否可以使用此堆栈(NetworkX、pygraphviz、graphviz)? 还有什么办法吗?

背景动机是这样的。 Graphviz 输出 png、或 ps、或 svg 和许多其他格式。 但我不想受到 Graphviz 处理的格式的限制。 而且我希望能够对布局结果进行后处理,即使我最终输出了 Graphviz 支持的流行格式。

更新:为了清楚起见,我已经重写了这个问题。 关于 Graphviz 输出格式的建议没有抓住重点。 这是我需要的布局数据

更新 2 :一个建议是以某种格式制作 Graphviz 输出,然后我可以从中解析布局数据。 这个建议是针对 SVG 的。 我曾考虑过这种可能性。 Graphviz 输出 json(根据Graphviz 输出格式文档页面)。 我未能使其在我的 Windows 安装中工作 - 由于某种原因,并非所有输出格式都存在)。 然而,正是这种方法让我感到不安。 解析用于创建该输出的数据的格式化输出似乎是倒退的。 我认为,数据本身应该是可用的。

更新 3 - 有一个类似的问题 - 如何从 graphviz 的布局中获取坐标? . 答案之一建议使用 NetworkX。 然而,答案使用由 NetworkX 而不是 Graphviz 制作的布局。 答案的作者不知道如何获取Graphviz布局数据。 所以我的问题仍然相关,但仍有待回答

更新 4 - 现在是 07-2019,我仍然没有找到解决这个问题的方法。 我将一个答案标记为已接受 - 但有一个警告 - 尽管在该答案中找到了很好的建议,但我仍然一无所知

迈克尔,我重新阅读了你的问题和评论,并使用我知道的工具(我知道如何使用),这就是我会在你的鞋子里做的。 我会在 DOT/GraphViz 中绘制您的图表,然后选择一种人类可读且易于解析的格式,例如 SVG、“plain”,甚至 x-dot。 为什么? 不是为了得到图形本身——其中一些甚至没有实现图形——而是因为这些格式是人类可读的并且包含不同绘图组件的 XY 坐标 您可以根据自己的目的使用这些坐标和大小。 我刚刚做的一个简单图表中的一些片段应该可以说明。 SVG优先

<svg width="89pt" height="188pt"

<g id="node1" class="node"><title>A</title>
<ellipse fill="none" stroke="black" cx="54" cy="-162" rx="27" ry="18"/>
<text text-anchor="middle" x="54" y="-158.3" font-family="Times New Roman,serif" font-size="14.00">A</text>

或者以“普通”格式,也许最简单的解析:

graph 1 0.75 1.5
node A 0.375 1.25 0.75 0.5 A solid ellipse black lightgrey
node B 0.375 0.25 0.75 0.5 B solid ellipse black lightgrey
edge A B 4 0.375 0.99579 0.375 0.88865 0.375 0.7599 0.375 0.64045 solid black
stop

或类似 html 的 VML:

<v:oval style="position:absolute; left: 0.00; top: 0.00; width: 54.00; height: 36.00" filled="false"  >

等等......不难想象解析出各种元素的所有 X-Y 并在您认为合适的情况下重新利用它们。

关于更新 4

现在仍然是 2019 年,但这非常适合我的需求

import networkx as nx
G = nx.complete_graph(10)
pos = nx.drawing.nx_agraph.graphviz_layout(G, prog='dot')
print(pos)

给我吗

{0: (327.0, 666.0), 1: (504.0, 594.0), 2: (327.0, 522.0), 3: (449.0, 450.0), 4: (283.0, 378.0), 5: (283.0, 306.0), 6: (473.0, 234.0), 7: (287.0, 162.0), 8: (418.0, 90.0), 9: (287.0, 18.0)}

节点和位置的字典!

问候 dom

PyGraphviz 没有用于检索和设置布局信息(例如节点形状、边缘路由等)的 API。我不知道 Graphviz C 库这些部分的任何 Python 接口。 Graphviz 本身确实提供了一个 Python 接口,包括渲染器,但我认为它也不能完全满足您的要求 - 请参阅http://www.graphviz.org/pdf/gv.3python.pdf

最简单的方法确实可以按照@JHL 的建议生成 SVG。

这是另一种解决方案。 它与 Dominik Ku​​mmer 的不同,因为它公开了pygraphviz.AGraph对象,从而可以指定任意的 gaphviz 属性来自定义布局。

import networkx as nx
import pygraphviz as pgv

g = nx.complete_graph(10)
ag = nx.drawing.nx_agraph.to_agraph(g)
ag.layout(prog='dot')
layout = [ag.get_node(n).attr['pos'] for n in ag.nodes()]
layout = [[int(ss) for ss in s.split(",")] for s in layout]
print(layout)

给我吗:

[[327, 666], [504, 594], [327, 522], [449, 450], [283, 378], [283, 306], [473, 234], [287, 162], [418, 90], [287, 18]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM