📅  最后修改于: 2023-12-03 15:03:09.850000             🧑  作者: Mango
在网络分析中,有向图和多重图是常见的概念,而 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 中,我们可以使用多种方式来可视化有向图,如 draw
、draw_circular
、draw_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 中,我们可以使用多种方法来可视化图形数据,如上述例子中用到的 draw
、draw_circular
、draw_kamada_kawai
等方法,还有其他的方法如 draw_spectral
、draw_spring
、draw_shell
等。
另外,我们还可以使用 Matplotlib 样式表来美化图形输出,如 ggplot
、seaborn
、fivethirtyeight
等风格。
# 使用 seaborn 风格
plt.style.use('seaborn')
# 绘制有向图
nx.draw(G, with_labels=True)
# 显示图形
plt.show()
上述代码使用了 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 中的有向图、多重图和可视化方面的介绍,希望对编程工作者们有所帮助。