

pythonを使用してノードの座標を指定した状態でエッジの重み付き多重指向グラフを描画したいのですが，  
何か良い方法はないでしょうか．

networkxとpyplotを使用して描画してみたのですが矢印同士が重なって表示されてしまうためうまくいきませんでした．

[code]

    nodes = pd.DataFrame([[[1, 3]], [[0, 2]], [[3, 3]], [[5, 2]], [[2, 4]]], columns=['coords'])
    nodes.index = ['A', 'B', 'C', 'D', 'E']
    edges = pd.DataFrame([['A','B', 4], ['B','A', 20], ['C','B', 3], ['D','D' ,10], ['C','A', 7], ['E','A' ,2], ['D','C' ,15], ['C','E', 8], ['D','A', 2]], columns=['start', 'end', 'weight'])
    
    G = nx.MultiDiGraph()
    G.add_nodes_from(nodes.index)
    for index, row in edges.iterrows():
        G.add_edge(row.start, row.end, weight=row.weight)
    
    nx.draw_networkx_labels(G, nodes.coords, font_size=16)
    nx.draw_networkx_edge_labels(G, nodes.coords, weight=edges.weight)
    nx.draw(G, nodes.coords)
    
    plt.show()
    
[/code]


CC BY-SA 4.0
2019-02-15T08:47:07.090
52794
2020-06-12T18:01:50.197
29485
question
python jupyter-notebook
pythonを使った重み付きの多重指向グラフの描画について


エッジ(矢印)を重ねたくないなら、graphvizを使うのがよいと思います。  
重みでエッジの位置を短くすることもできますが(※)、重みはエッジのラベルで表現することもできます。  
jupyter-notebookで確かめたことはありませんが、AnacondaのSpyderで書いたことがあります。  
※graphvizでは思うような位置にノードやエッジを配置するのは難しいですし、graphvizの良さが活かせません。

* * *

以下コードサンプルです。

[code]

    import graphviz
    g = graphviz.Digraph(format='svg')
    g.attr('node', shape='circle')
    g.attr('node', style ='filled')
    g.attr('node', fillcolor='orange')
    g.attr('node', color='orange')
    
    for node in nodes.index:
        g.node(node, node)
    
    for index, row in edges.iterrows():
        g.attr('edge', weight=str(row.weight))
        g.edge(row.start, row.end, label='{weight:'+str(row.weight)+'}')
    
    print(g)
    g.view()
    
    
[/code]

実行するときは、質問された方のコードに追記してください。  
※実行には質問された方のコードの先頭に以下も追加してください。

[code]

    import networkx as nx
    import pandas as pd
    
[/code]

元の画像  
[![質問者のコード実行結果](https://i.stack.imgur.com/Q1Bz9.png)](https://i.stack.imgur.com/Q1Bz9.png)  
graphvizによる描画  
[![graphvizによる描画](https://i.stack.imgur.com/XpIDS.png)](https://i.stack.imgur.com/XpIDS.png)


CC BY-SA 4.0
2019-09-13T08:32:33.913
59038
2019-09-15T01:18:43.713
2019-09-15T01:18:43.713
35558
35558
52794
answer