散景中的快速定向图

时间:2017-03-07 14:13:13

标签: python networkx bokeh

要绘制图形(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而不是这个,但是没有办法添加箭头。或者有没有?

2 个答案:

答案 0 :(得分:1)

我曾经使用networkx用'箭头'生成图形,实际上不是真正的箭头,但可以像对待一样:enter image description here

生成此代码的代码是实现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 tutorialsgithub codemulti_line函数不是图形绘制函数,只能用于线性数据图,只是有多个数据源。

但是,该功能接受LineProps对象,因此您可以尝试根据需要进行调整。目前,line options是:

  • line_color
  • line_width
  • line_alpha
  • line_join
  • line_cap
  • line_dash
  • line_dash_offset

我建议您尝试使用可能的值line_join属性:

  • 'miter'enter image description here
  • 'round'enter image description here
  • 'bevel'enter image description here

所以方法可能是这样的:

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