python - 如何在使用graphviz渲染的图形中获取节点坐标

标签 python graphviz dot graph-visualization

我正在实现一个逐步图形转换算法,其中在每个步骤中删除或添加节点,并希望将所有中间图形的跟踪记录为图像文件,其中节点在删除之前保持在相同位置呈现。这将有助于制作最终动画。

我想从布局引擎计算的初始步骤中获取节点位置,然后将它们作为节点属性传递给后续步骤。

我正在使用 graphviz 库,但我找不到任何方法来获取渲染图中的节点坐标( pos 属性)。这是一段代码摘录。

    from graphviz import Digraph
    dot = Digraph()
    dot.node('x', label='hello')
    dot.node('y', label='world')
    dot.edge('x', 'y')
    dot.render(filename='hello.gv', view=True, cleanup=False)

我还检查了dot对象,但一无所获。我错过了什么吗?我无法确定头寸是否通过 API 导出。在这种情况下,哪个不同的库可以提供帮助?

最佳答案

首先,您需要pipe并将您的 Digraph 对象解码为 JSON 格式。之后,您可以将 JSON 字符串转换为 JSON 对象并解析它:

# import JSON parser
import json

# decode the Digraph to JSON format
json_string = dot.pipe('json').decode()

# parse the resulting json_string
json_dict = json.loads(json_string)

# now, you have a JSON dictionary that has two relevant keys:
# 'objects' for nodes and 'edges' for, well, edges.
# you can iterate over the nodes and get the (x,y) position for each node as follows:
for obj in json_dict['objects']:
    print(obj['name'], '\t', obj['pos'])
我必须在 graphviz.FORMATS 中尝试每种格式才能找到最合适的一种。
我知道可能为时已晚,但以防万一您或其他任何人需要答案。

关于python - 如何在使用graphviz渲染的图形中获取节点坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57289762/

相关文章:

python - 无法对 Pandas 数据框进行子集化

graphviz - 顶部对齐节点

java - 使用DOT语言或java或类似语言绘制范围柱形图?

graphviz - 是否可以在graphviz中将子图进一步分开

graphviz - 如何在graphviz中隐藏节点边界?

存在集群时的 GraphViz 水平顺序

python - 带负方向的 Matplotlib Quiver

python - 如何让 numpy.zeros() 和 (numpy.ones() * 255) 分别产生黑白图像?

python - 达斯克不安装graphviz依赖

python - Pandas 将行换行到下一列