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

时间:2014-04-30 14:02:58

标签: python graph plot networkx

我有一个(有向非循环)图,这样每个节点都有一个离散的时间戳,即每个节点都标有一个数字:1,2,3,4 ......

图表可能包含多个组件,时间戳随着图表的方向而增加。

我将图形作为 netowrkx 对象,现在我想用图形s.t在python中创建一个图形。节点的高度由它的时间戳确定(底部的较低时间戳和底部的较高时间戳和具有相同时间戳的节点处于相同的高度)。这意味着,例如,2个组件可以"开始" (如果他们的时间戳不同,他们的根高度)在不同的初始高度。

另一方面,如果节点A标记为time = 4,节点B标记为5,我希望B在图中较低。

第3个示例:如果2个节点是第三个节点的子节点但是它们是在不同时间创建的 - 对于最新节点,s.t.的边缘将更长。每个孩子都将处于自己的时间水平。

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

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 个答案:

答案 0 :(得分: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),并且所有节点将以垂直线结束。你应该能够根据你的需要改变它。