在networkx中如何给多重图着色、加权和绘制?

4

这个答案演示了如何使用以下代码绘制具有自定义颜色和边缘粗细的图形:

import networkx as nx

G = nx.Graph()
G.add_edge(1,2,color='r',weight=2)
G.add_edge(2,3,color='b',weight=4)
G.add_edge(3,4,color='g',weight=6)

pos = nx.circular_layout(G)

edges = G.edges()
colors = [G[u][v]['color'] for u,v in edges]
weights = [G[u][v]['weight'] for u,v in edges]

nx.draw(G, pos, edges=edges, edge_color=colors, width=weights)

假设我想绘制一个多图,如下所示:
G = nx.MultiGraph()
G.add_edge(1,2,color='r',weight=2)
G.add_edge(1,2,color='b',weight=3)
G.add_edge(2,3,color='r',weight=4)
G.add_edge(2,3,color='b',weight=6)

调用 draw 等类似函数应该会产生三个点。点 1 和 2 之间应该有 红色和蓝色 两条线,同样地,点 2 和 3 之间也应该有 红色和蓝色 两条线。

这对于多重图无法工作,因为多重边需要不同的存储技术。是否有相对简单的方法解决这个问题?

此外,我认为 问题和答案 不适用。提问者使用了 MultiGraph 对象,但实际图不是多重图。解决方案是选择第一个(在他的情况下,唯一的)边。然而,在绘图阶段需要两条边。

是否有一种方法在 networkx 中以不同的颜色和权重绘制多重边?


你是否恰好有两组边?在这种情况下,我个人通常会发现网络线图更具信息性。例如,像这样的东西。 - Paul Brodersen
@Paul Atm,我受到约束,必须使用循环图,但除此之外,你是正确的。这个项目确实看起来很有趣! - Dair
1个回答

3
你只需要以不同的方式访问多重图的边缘。
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.MultiGraph()
G.add_edge(1,2,color='r',weight=8)
G.add_edge(1,2,color='b',weight=3)
G.add_edge(2,3,color='r',weight=4)
G.add_edge(2,3,color='c',weight=6)

pos = nx.circular_layout(G)

edges = G.edges()

colors = []
weight = []

for (u,v,attrib_dict) in list(G.edges.data()):
    colors.append(attrib_dict['color'])
    weight.append(attrib_dict['weight'])


nx.draw(G, pos, edges=edges, edge_color=colors, width=weight, )
plt.show()

输入图像描述

这里是另一种边的组合方式

G = nx.MultiGraph()
G.add_edge(1,2,color='r',weight=2)
G.add_edge(1,2,color='b',weight=3)
G.add_edge(2,3,color='r',weight=4)
G.add_edge(2,3,color='b',weight=6)

在此输入图像描述

你可以在这里了解有关访问multigraph edges的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接