📜  Networkx 中的有向图、多重图和可视化(1)

📅  最后修改于: 2023-12-03 15:03:09.850000             🧑  作者: Mango

Networkx 中的有向图、多重图和可视化

在网络分析中,有向图和多重图是常见的概念,而 Networkx 作为一款常用的 Python 图形库,支持在 Python 中快速处理和可视化这些图形数据。

有向图

有向图是一种图形结构,其中每个节点(或顶点)之间都有方向性(有向边),表示从一个节点到另一个节点的方向性关系。在 Networkx 中,我们可以使用 DiGraph 类来创建有向图,并添加节点和边。

import networkx as nx

# 创建空的有向图
G = nx.DiGraph()

# 添加节点
G.add_node('A')
G.add_node('B')
G.add_node('C')

# 添加边
G.add_edge('A', 'B')
G.add_edge('B', 'C')
G.add_edge('C', 'A')

上述代码创建了一个有向图,其中节点分别为 'A'、'B'、'C',并添加了三条有向边,分别为从 'A' 到 'B',从 'B' 到 'C',从 'C' 到 'A'。

在 Networkx 中,我们可以使用多种方式来可视化有向图,如 drawdraw_circulardraw_kamada_kawai 等方法。下面是通过 draw 方法来可视化创建好的有向图:

import matplotlib.pyplot as plt

# 绘制有向图
nx.draw(G, with_labels=True)

# 显示图形
plt.show()

有向图

多重图

多重图是一种图形结构,其中节点之间可以有多个相同方向的边,表示节点之间可能有多种具有相同关系的连接方式。在 Networkx 中,我们可以使用 MultiGraph 类来创建多重图,并添加节点和边。

# 创建空的多重图
G = nx.MultiGraph()

# 添加节点
G.add_node('A')
G.add_node('B')
G.add_node('C')

# 添加边
G.add_edge('A', 'B', relation='friends')
G.add_edge('A', 'B', relation='classmates')
G.add_edge('B', 'C', relation='colleagues')
G.add_edge('C', 'A', relation='partners')

上述代码创建了一个多重图,其中节点分别为 'A'、'B'、'C',并添加了四条边,其中从 'A' 到 'B' 有两条边表示 'A' 和 'B' 之间有两种不同关系,其他边同理。

在 Networkx 中,我们可以通过 get_edge_colors_by_label() 方法来通过边的 relation 属性来区分不同颜色的边,然后使用 draw_networkx_edge_labels() 方法来在边上添加标签。下面是通过这两个方法来可视化创建好的多重图:

# 获得边的颜色(根据 relation 属性)
colors = []
for u, v, attr in G.edges(data=True):
    colors.append(attr['relation'])

# 绘制多重图
nx.draw(G, with_labels=True, edge_color=colors)

# 在边上添加标签
nx.draw_networkx_edge_labels(G, pos=nx.spring_layout(G), edge_labels=nx.get_edge_attributes(G, 'relation'))

# 显示图形
plt.show()

多重图

可视化

在 Networkx 中,我们可以使用多种方法来可视化图形数据,如上述例子中用到的 drawdraw_circulardraw_kamada_kawai 等方法,还有其他的方法如 draw_spectraldraw_springdraw_shell 等。

另外,我们还可以使用 Matplotlib 样式表来美化图形输出,如 ggplotseabornfivethirtyeight 等风格。

# 使用 seaborn 风格
plt.style.use('seaborn')

# 绘制有向图
nx.draw(G, with_labels=True)

# 显示图形
plt.show()

有向图(seaborn)

上述代码使用了 seaborn 样式表来美化图形输出。

完整代码如下:

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_edge('A', 'B')
G.add_edge('B', 'C')
G.add_edge('C', 'A')

# 绘制有向图
nx.draw(G, with_labels=True)

# 使用 seaborn 风格
plt.style.use('seaborn')

# 显示图形
plt.show()

以上就是 Networkx 中的有向图、多重图和可视化方面的介绍,希望对编程工作者们有所帮助。