我想使用NetworkX创建图形,使用Graphviz(通过pygraphviz)布局图形。我已经成功运行了NetworkX pygraphviz examples documentation
中的所有示例我的问题是 - 如何将顶点的坐标(x,y)和尺寸(宽度,高度)返回到NetworkX图形中。 这就是目标。我只想要Graphviz'布局功能,而不是绘图功能。这可能使用这个堆栈(NetworkX,pygraphviz,graphviz)?还有别的吗?
背景动机是这样的。 Graphviz输出png,或ps,或svg以及许多其他格式。 但我不想受到Graphviz处理格式的限制。 而且我希望能够对布局结果进行后期处理 如果我最终输出流行的格式,如Graphviz支持。
更新:为了清晰起见,我重写了这个问题。关于Graphviz输出格式的建议忽略了这一点。这是我需要的布局数据
Update2 :一个建议是以某种格式制作Graphviz输出,然后我可以从中解析布局数据。建议是SVG。 我曾考虑过这种可能性。 Graphviz输出json(根据Graphviz output formats documentation page)。我没能在我的Windows安装上工作 - 由于某些原因并不是所有的输出格式都存在。然而,这种方法让我感到不安。解析用于创建该输出的数据的格式化输出似乎是向后的。我想,数据本身应该已经可用。
更新3 - 有一个类似的问题 - How to get the coordinates from layout from graphviz?。其中一个答案建议使用NetworkX。然而,答案使用的是NetworkX而不是Graphviz的布局。答案的作者不知道如何获取Graphviz布局数据。所以我的问题仍然有用,但尚未得到解答
答案 0 :(得分:1)
<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>
或者&#34; plain&#34;格式,也许最简单的解析:
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并按照你认为合适的方式重新定位它们。
答案 1 :(得分:0)
PyGraphviz没有用于检索和设置布局信息的API,例如节点形状,边缘路由等。我不知道Graphviz C库的那些部分有任何Python接口。 Graphviz本身确实提供了一个Python界面,包括渲染器,但我不认为它完全符合您的要求 - 请参阅http://www.graphviz.org/pdf/gv.3python.pdf。
最简单的方法可能确实是通过@JHL建议生成SVG。
答案 2 :(得分:0)
关于更新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
答案 3 :(得分:0)
这是另一种解决方案。
它与Dominik Kummer的不同之处在于它公开了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]]