要绘制图形(networkx.DiGraph
),我使用以下代码(循环遍历所有边缘):
arrow = Arrow(end=OpenHead(line_color=color, line_width=12, size=14),
y_start=pos[from_node][1],
x_start=pos[from_node][0],
x_end=pos[to_node][0],
y_end=pos[to_node][1],
line_color=color, line_width=12)
plot.add_layout(arrow)
我想使用multi_line
而不是这个,但是没有办法添加箭头。或者有没有?
答案 0 :(得分:1)
我曾经使用networkx用'箭头'生成图形,实际上不是真正的箭头,但可以像对待一样:
生成此代码的代码是实现Kosaraju-Sharir算法(找到强连接组件);主要代码如下:
def generate_G():
G = defaultdict(set)
G['a'] = {'b', 'c'}
G['b'] = {'d', 'e', 'i'}
G['c'] = {'d'}
G['d'] = {'a', 'h'}
G['e'] = {'f'}
G['f'] = {'g'}
G['g'] = {'e', 'h'}
G['h'] = {'i'}
G['i'] = {'h'}
return G
def draw_G(raw_G):
import networkx as nx
import matplotlib
# generate postscript output by default from http://matplotlib.org/faq/usage_faq.html#what-is-a-backend
matplotlib.use('PS')
import matplotlib.pyplot as plt
import pylab
G = nx.DiGraph()
G.add_nodes_from(raw_G.keys())
G.add_edges_from([(u, v) for u in raw_G for v in raw_G[u]], weight=1)
pos = nx.spring_layout(G)
edge_labels = dict([((u, v,), d['weight'])
for u, v, d in G.edges(data=True)])
nx.draw_networkx_edges(G, pos, alpha=0.3)
nx.draw(G, pos=pos, node_size=250, with_labels=True, )
plt.axis('off')
plt.savefig("kosaraju.png")
if __name__ == "__main__":
raw_G = generate_G()
draw_G(raw_G)
完整的代码可以在我的github上找到,如果你有兴趣:https://github.com/albertmenglongli/Algorithms/blob/master/PythonAlgrithoms/kosaraju.py,生成的图片在这里:https://github.com/albertmenglongli/Algorithms/blob/master/PythonAlgrithoms/kosaraju.png
如果有兴趣的话,我试图以更加工程化的方式实施许多algrothims。
答案 1 :(得分:1)
据我所知in tutorials和github code,multi_line
函数不是图形绘制函数,只能用于线性数据图,只是有多个数据源。
但是,该功能接受LineProps
对象,因此您可以尝试根据需要进行调整。目前,line options是:
line_color
line_width
line_alpha
line_join
强> line_cap
line_dash
line_dash_offset
我建议您尝试使用可能的值line_join
属性:
所以方法可能是这样的:
from bokeh.plotting import figure, output_file, show
p = figure(plot_width=300, plot_height=300)
p.multi_line(xs=[[1, 2, 3], [2, 3, 4]], ys=[[6, 7, 2], [4, 5, 7]],
color=['red','green'], line_join='miter')
show(p)
可以找到bokeh.plotting
的完整参考here。