2012-12-20 70 views
7

我的论文我需要绘制一些概率控制流图。即在边缘描绘概率的控制流图。图形工具:绘制文字的边缘

我发现图形工具似乎很有用,因为它可以使用现有图形的深度副本,而且我的图形非常相似。

所以我的问题是,如果有可能在边缘上/旁边画边缘属性(或一些字符串)?如果不可能或者非常复杂,在这种情况下是否有更好的工具?

编辑︰ 我需要有向边,甚至可以创建2个节点之间的循环,并具有不同的值。这也有可能吗?所以我可以看到两个值?现在我可以看到带有2方向边缘的有向图,但只有一个值。

因此,例如,在networkx(参考带钩),它看起来像:

G = nx.MultiDiGraph() 
G.add_edge(0,1) 
G.add_edge(1,0) 
labels = {(0,1):'foo', (1,0):'bar'} 

这样既“富”和“酒吧”是可见的,你可以看到哪个方向它们连接到。

但是,随着networkx渲染它,我得到1个双向边和1个标签。

回答

2
import networkx as nx 

# Sample graph 
G = nx.Graph() 
G.add_edge(0,1) 
G.add_edge(1,2) 
G.add_edge(2,3) 
G.add_edge(1,3) 

labels = {(0,1):'foo', (2,3):'bar'} 

pos=nx.spring_layout(G) 

nx.draw(G, pos) 
nx.draw_networkx_edge_labels(G,pos,edge_labels=labels,font_size=30) 

import pylab as plt 
plt.show() 

enter image description here

编辑:如果您需要边缘标签multidigraphs,我不认为你可以完全内networkx做到这一点。但是你可以做大部分的Python和与其他程序做的渲染和布局:

import networkx as nx 

G = nx.MultiDiGraph() 
G.add_edge(0,1, label='A') 
G.add_edge(1,0, label='B') 
G.add_edge(2,3, label='foo') 
G.add_edge(3,1, label='bar') 
nx.write_dot(G, 'my_graph.dot') 

我用graphviz把它变成一个图像。在我的Unix机器上,我通过命令行运行这个命令:

dot my_graph.dot -T png > output.png 

其中给出了您要查找的所需输出。请注意graphviz有many ways to customize the visual appearance。上面的例子只是生产:

enter image description here

+0

高兴它帮助!我不知道你确切需要什么,但是networkx也可以绘制定向图和多图图。对于您的论文,请务必将生成的图像保存为PDF而不是PNG以保持质量(ex http://stackoverflow.com/a/9890599/249341) – Hooked

+0

我刚刚阅读教程并尝试MultiDiGraph,因为我需要有向边,甚至可以在2个节点之间创建循环并具有不同的值。这也有可能吗?所以我可以看到两个值?现在我可以看到带有2方向边缘的有向图,但只有一个值。 –

7

可以使用graph_draw()函数的 “edge_text” 选项,然后绘制文本的边缘与graph-tool

from graph_tool.all import * 

g = Graph() 
g.add_vertex(4) 
label = g.new_edge_property("string") 
e = g.add_edge(0, 1) 
label[e] = "A" 
e = g.add_edge(2, 3) 
label[e] = "foo" 
e = g.add_edge(3, 1) 
label[e] = "bar" 
e = g.add_edge(0, 3) 
label[e] = "gnat" 

graph_draw(g, edge_text=label, edge_font_size=40, edge_text_distance=20, edge_marker_size=40, output="output.png") 

enter image description here