繁体   English   中英

如何在python中使用networkx绘制有向图?

[英]how to draw directed graphs using networkx in python?

我有一些节点来自我想映射到图形的脚本。 在下面,我想使用箭头从 A 转到 D,并且可能将边缘着色为(红色或其他颜色)。

这基本上就像当所有其他节点都存在时从 A 到 D 的路径。 你可以把每个节点想象成城市,从 A 到 D 旅行需要方向(带箭头)。

下面的代码构建了图形

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 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 notebook 渲染它,我不得不直接从 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()

在此处输入图片说明

您可能想要使用代替常规的 nx.draw :

nx.draw_networkx(G[, pos, arrows, with_labels])

例如:

nx.draw_networkx(G, arrows=True, **options)

您可以通过初始化该 ** 变量来添加选项,如下所示:

options = {
    'node_color': 'blue',
    'node_size': 100,
    'width': 3,
    'arrowstyle': '-|>',
    'arrowsize': 12,
}

还有一些函数支持directed=True parameter在这种情况下,这种状态是默认状态:

G = nx.DiGraph(directed=True)

可在此处找到 networkx 参考。

带箭头的图形图像

您需要使用有向图而不是图,即

G = nx.DiGraph()

然后,创建要使用的边缘颜色列表并将它们传递给nx.draw (如@Marius 所示)。

把这一切放在一起,我得到了下面的图片。 仍然不是你展示的另一张照片(我不知道你的边缘权重来自哪里),但更接近! 如果您想更多地控制输出图的外观(例如获得看起来像箭头的箭头),我会使用 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()

这只是如何使用 networkx 使用 python 3.x 绘制有向图的简单方法。 只是简单的表示,可以修改和着色等。请参阅此处生成的图表。

注意:这只是一个简单的表示。 可以添加加权边,例如

g.add_edges_from([(1,2),(2,5)], weight=2)

因此再次绘制。

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_node("A")
G.add_node("B")
G.add_node("C")
G.add_node("D")
G.add_node("E")
G.add_node("F")
G.add_node("G")
G.add_edge("A","B")
G.add_edge("B","C")
G.add_edge("C","E")
G.add_edge("C","F")
G.add_edge("D","E")
G.add_edge("F","G")

print(G.nodes())
print(G.edges())

pos = nx.spring_layout(G)

nx.draw_networkx_nodes(G, pos)
nx.draw_networkx_labels(G, pos)
nx.draw_networkx_edges(G, pos, edge_color='r', arrows = True)

plt.show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM