首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在python中使用networkx绘制有向图?

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

Stack Overflow用户
提问于 2013-11-22 06:43:54
回答 6查看 198.9K关注 0票数 129

我有一些来自脚本的节点,我想将它们映射到一个图上。在下面,我想使用箭头从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()

但是我想要一些如图所示的东西。

将第一张图像的箭头和红色的边缘放置到第二张图像上。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-11-22 07:04:30

完全充实的示例,只有红色边的箭头:

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()

票数 109
EN

Stack Overflow用户

发布于 2013-11-22 08:24:24

我把这个放进去只是为了完整。我从marius和mdml那里学到了很多。这是边权重。箭头的事很抱歉。看来我不是唯一一个说它无能为力的人。我不能用ipython notebook渲染它,我必须直接从python转到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()

票数 51
EN

Stack Overflow用户

发布于 2018-02-27 03:41:23

您可能希望使用以下命令来代替常规的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参考资料可以在here找到。

票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20133479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档