2012-12-20 132 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