2014-04-30 51 views
0

我有一个(有向无环)图,这样每个节点都有一个离散的时间戳,即每个节点都标有一个数字:1,2,3,4 ...在节点上绘制带有时间标签的图形

该图可能具有多个组件,并且时间戳随着图的方向而增加。

我有图netowrkx对象,现在我想用图s.t创建一个python图。一个节点的高度由它的时间标记决定(底部较高的时间戳和较低的时间标记以及具有相同时间标记的节点处于相同高度)。这意味着,例如,如果它们的时间戳不同,则2个分量可以在不同的初始高度处“开始”(它们的根高度)。另一方面,给定用时间= 4标记的节点A和标记为5的节点B,我希望B在图中较低。

第三个例子:如果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中绘制这个?哪个软件包可以帮助我?

+0

这是有点不清楚,但如果我正确理解这一点,你想要指定每个节点的高度基于它的时间戳。你不能设置每个节点的几何位置吗?向我们展示迄今为止所做的工作(代码)可以帮助我们了解应该改变或完成不同的工作。 – Reti43

+0

谢谢你Reti。 如何指定networkx中节点的几何位置? 该图可能很大,所以我确实需要它是自动的。 – slouis

回答

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坐标将放置节点更高的曲线A更高的值。所以如果你想让根节点位于顶部(较低的时间戳值),只需使用时间戳的负数,因为-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),并且所有节点都以垂直线结束。你应该能够根据你的需求来改变它。

+0

嘿雷蒂,谢谢 - 这是非常有用的。这是我的第一个堆栈溢出问题 - 这是非常令人印象深刻的,看到这个网站的力量和周围的好人。干杯! – slouis

相关问题