在节点上绘制带时间标签的图

0 投票
1 回答
960 浏览
提问于 2025-04-18 04:53

我有一个(有向无环)图,每个节点都有一个离散的时间戳,也就是说,每个节点都有一个数字标签:1, 2, 3, 4……

这个图可能有多个部分,而且时间戳是随着图的方向而增加的。

我把这个图作为networkx对象,现在我想在Python中创建一个图形,使得节点的高度由它的时间戳决定(时间戳较低的在上面,较高的在下面,时间戳相同的节点在同一高度)。也就是说,比如说,如果两个部分的根节点的时间戳不同,它们的起始高度可以不同。

另一方面,假设节点A的时间戳是4,节点B的时间戳是5,我希望在图中B的位置比A低。

第三个例子:如果两个节点是第三个节点的子节点,但它们的创建时间不同,那么后创建的那个节点的边会更长,这样每个子节点就会在自己的时间层级上。

现在,我的代码非常简单:

import networkx as nt
import matplotlib.pyplot as plt

graph = networkx.DiGraph() 
self.graph.add_node("A", time = 1)
...# Add more nodes
graph.add_edge("A","B")
...# Add more edges
plt.figure(1,figsize=(30,10))
pos=nt.graphviz_layout(graph,prog='dot')
networkx.draw(graph,pos,with_labels=False,arrows=True, node_size = 80)

(我没有足够的声望来上传结果的图片…… :-) )

我该如何在Python中绘制这个图形?有什么包可以帮助我吗?

1 个回答

1

节点的位置是通过一个字典来定义的,字典的键是节点的名字,值是一个包含x和y坐标的元组。

你可以在创建完pos变量后打印出来查看:

pos=nt.graphviz_layout(graph,prog='dot')
print pos

# EXAMPLE RESULT
{'A': (51.5, 15.3), 'B': (20.0, 60.4)}

y坐标的值越大,节点在图中的位置就越高。所以如果你想让根节点在最上面(时间戳值较小),只需使用时间戳的负值,因为-1会比-2高。

为了自动化节点的放置过程,你需要根据时间来设置一些公式。

pos = {}
for key, value in graph.node.items():
    height = value['time']    # Time value as defined when adding the node `key`
    pos[key] = (50, -height)

这样可以根据时间戳将节点垂直放置。所以在时间1和4创建的两个节点之间的距离会是时间1和2创建的两个节点之间距离的两倍。在这个例子中,我保持了水平组件为静态值(50),所有节点最终会排成一条垂直线。你可以根据自己的需要调整这个值。

撰写回答