如何在Python中使用networkx绘制有向图?
我有一些节点来自我想映射到一个graphics的脚本。 在下面,我想使用箭头从A到D,也许有(红色或其他)颜色的边缘。 这基本上就是当所有其他节点都存在时,从A到D的path。 您可以将每个节点想象为城市,从A到D的旅行需要方向(带箭头)。 下面的代码构build图
import networkx as nx import numpy as np import matplotlib.pyplot as plt G = nx.Graph() G.add_edges_from( [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'), ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')]) val_map = {'A': 1.0, 'D': 0.5714285714285714, 'H': 0.0} values = [val_map.get(node, 0.25) for node in G.nodes()] nx.draw(G, cmap = plt.get_cmap('jet'), node_color = values) plt.show()
但我想要的东西像在图像中显示。
第一个图像的箭头和红色的边缘到第二个图像..谢谢
充分充实的例子与箭头只有红色的边缘:
import networkx as nx import numpy as np import matplotlib.pyplot as plt G = nx.DiGraph() G.add_edges_from( [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'), ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')]) val_map = {'A': 1.0, 'D': 0.5714285714285714, 'H': 0.0} values = [val_map.get(node, 0.25) for node in G.nodes()] # Specify the edges you want here red_edges = [('A', 'C'), ('E', 'C')] edge_colours = ['black' if not edge in red_edges else 'red' for edge in G.edges()] black_edges = [edge for edge in G.edges() if edge not in red_edges] # Need to create a layout when doing # separate calls to draw nodes and edges pos = nx.spring_layout(G) nx.draw_networkx_nodes(G, pos, cmap=plt.get_cmap('jet'), node_color = values, node_size = 500) nx.draw_networkx_labels(G, pos) nx.draw_networkx_edges(G, pos, edgelist=red_edges, edge_color='r', arrows=True) nx.draw_networkx_edges(G, pos, edgelist=black_edges, arrows=False) plt.show()
我只是把这个完整的。 我从marius和mdml学到了很多东西。 这里是边缘权重。 对不起,关于箭头。 看起来我不是唯一一个说不能帮助的人。 我不能用ipython笔记本来渲染这个,我不得不直接从python那里得到我的边缘权重的问题。
import networkx as nx import numpy as np import matplotlib.pyplot as plt import pylab G = nx.DiGraph() G.add_edges_from([('A', 'B'),('C','D'),('G','D')], weight=1) G.add_edges_from([('D','A'),('D','E'),('B','D'),('D','E')], weight=2) G.add_edges_from([('B','C'),('E','F')], weight=3) G.add_edges_from([('C','F')], weight=4) val_map = {'A': 1.0, 'D': 0.5714285714285714, 'H': 0.0} values = [val_map.get(node, 0.45) for node in G.nodes()] edge_labels=dict([((u,v,),d['weight']) for u,v,d in G.edges(data=True)]) red_edges = [('C','D'),('D','A')] edge_colors = ['black' if not edge in red_edges else 'red' for edge in G.edges()] pos=nx.spring_layout(G) nx.draw_networkx_edge_labels(G,pos,edge_labels=edge_labels) nx.draw(G,pos, node_color = values, node_size=1500,edge_color=edge_colors,edge_cmap=plt.cm.Reds) pylab.show()
你需要使用有向图而不是图,即
G = nx.DiGraph()
然后,创build一个你想使用的边缘颜色列表,并将其传递给nx.draw
(如@Marius所示)。
把这一切放在一起,我得到下面的图像。 仍然不完全是你展示的其他图片(我不知道你的边缘重量是从哪里来的),但更接近! 如果你想要更多地控制输出graphics的外观(例如箭头看起来像箭头),我会用Graphviz来检查NetworkX 。
import networkx as nx import matplotlib.pyplot as plt g = nx.DiGraph() g.add_nodes_from([1,2,3,4,5]) g.add_edge(1,2) g.add_edge(4,2) g.add_edge(3,5) g.add_edge(2,3) g.add_edge(5,4) nx.draw(g,with_labels=True) plt.draw() plt.show()
这只是简单的如何使用networkingx使用Python 3.x绘制有向图。 只是简单的表示,可以修改和着色等。看到这里生成的graphics。
注意:这只是一个简单的表示。 加权的边缘可以像添加一样
g.add_edges_from([(1,2),(2,5)], weight=2)
并因此再次绘制。