GraphViz - 使用python在节点/边缘的各种列表之上生成图形?

时间:2013-04-16 09:27:13

标签: python graph graphviz pygraphviz

我有一个彼此相关的项目列表,我知道他们最终会构建一个图表,但数据没有以任何方式排序。

PMO-100 -> SA-300
SA-100 -> SA-300
SA-100 -> SA-200
PMO-100 -> SA-100

在graphViz api的python示例中,我意识到,如果您知道它是顶级节点并且可以运行级别并构建所有关系,那么您几乎可以生成图形。

因为我得到了一个分类列表(我只知道它是一个图形,因为所有关系都是从一个点开始计算的) - 有没有办法在这些数据之上构建图形?

更新:此问题的第一条评论表明我没有正确解释我的目标。实际上,以下代码可以为您提供正确的图表:

gr = pydot.Dot(graph_type='digraph')
    for link in graph.links:
        edge = pydot.Edge(link.outwardIssue.key, link.inwardIssue.key)
        gr.add_edge(edge)
    gr.write('graph.png',format='png')

我的问题是 - 我如何为单个节点着色或更改特定边缘的箭头类型?

3 个答案:

答案 0 :(得分:1)

无需为graphviz识别顶级节点。只需添加所有节点和边缘,然后让它完成剩下的工作。例如:

import pydot
graph = pydot.Dot('graphname', graph_type='digraph') 
pmo100 = pydot.Node("PMO-100")
sa300 = pydot.Node("SA-300")
sa100 = pydot.Node("SA-100")
sa200 = pydot.Node("SA-200")
graph.add_edge(pydot.Edge(pmo100, sa300))
graph.add_edge(pydot.Edge(sa100, sa300))
graph.add_edge(pydot.Edge(sa100, sa200))
graph.add_edge(pydot.Edge(pmo100, sa100))
graph.write_png('example1_graph.png')

这将产生以下图像:

result

您可以在http://pythonhaven.wordpress.com/2009/12/09/generating_graphs_with_pydot/

找到更多信息

答案 1 :(得分:0)

如何更改节点的颜色:

node.attr [“color”] ='red'

改变箭头的形状,方法相同

edge.attr [“arrowhead”] =“......”

答案 2 :(得分:0)

试用pygraph包,它会根据关系语句(数据)生成有向图。无论数据是否排序。

所以(如你的情况)如果我们有以下数据(三重关系),很容易产生相应的图形:

第一种方式

s1 = "PMO-100 -> SA-300"
s2 = "SA-100 -> SA-300"
s3 = "SA-100 -> SA-200"
s4 = "PMO-100 -> SA-100"

from pygraph.dgraph import PyGraph

g = PyGraph()

g.add_relation(s1)
g.add_relation(s2)
g.add_relation(s3)
g.add_relation(s4)

g.draw_graph(label=False)

它会产生:

enter image description here

或者您甚至可以从文件中读取关系。

第二种方式

说,你有data.txt

PMO-100 -> SA-300
SA-100 -> SA-300
SA-100 -> SA-200
PMO-100 -> SA-100

在4 loc中更容易:

from pygraph.dgraph import PyGraph

g = PyGraph()

g.file_relations("data.txt")

g.draw_graph(label=False)

两种方式的结果都是一样的:

enter image description here