Python基于networkx实现有向图、无向图、无向多重图

该文章已生成可运行项目,

最近在做东西时学到了厉害的库——networkx ,记录一下。感受是有些厉害的东西不是因为你不会,而是你对他没有认知,不要胆怯,不要畏惧,不会都是正常的,扩大接触,持续学习,终有一日会连点成面。

学习过程中看到的一些文章
networkx,一个超强的Python库!

1. networkx 介绍

NetworkX是一个用Python语言开发的图论与复杂网络建模分析工具。用于创建、操作和研究复杂网络的结构、动力学和功能,它可以帮助我们创建、操作和研究复杂网络的结构和动态特性。

🎯 networkx 的核心优势在于:

  • 易用性: 纯Python,API直观,学习成本低。
  • 灵活性: 节点/边可以是任意对象并携带丰富属性,支持多种图类型。
  • 丰富性:提供海量的内置图算法和分析工具。
  • 互操作性: 与Python数据科学生态(Pandas, NumPy,SciPy)和多种文件格式无缝集成。
  • 社区: 开源免费,社区庞大活跃,文档优秀。

2. networkx 的核心功能

图的创建与操作:

  • 轻松创建空图、有向图、无向图、多重图(允许节点间有多条边)等。
  • 添加/删除节点和边。
  • 为节点和边添加任意属性(如权重、标签、颜色、大小等)。
  • 高效的图结构操作(合并图、子图提取、图转换等)。

图结构分析:

  • 节点分析: 计算度(连接的边数)、邻居节点、中心性度量(度中心性、接近中心性、中介中心性、特征向量中心性等)。
  • **边分析:**查询边的存在、属性。
  • 图整体分析: 计算图的密度、直径、平均路径长度、连通分量、聚类系数、同构检查等。
  • **路径与搜索:*寻找最短路径(Dijkstra, A)、所有简单路径、连通分量、最小生成树等。
  • **图算法:**实现了大量经典图算法(遍历如DFS/BFS、流计算、社区检测算法如Louvain、Girvan-Newman等、图嵌入、链接预测等)。

图的输入/输出:

  • 支持多种文件格式读写图数据(如GraphML, GML, GEXF, Pajek NET, JSON, Edge List等)。
  • 方便地与Pandas DataFrame、NumPy数组、SciPy稀疏矩阵等数据结构进行转换。

图的绘制与可视化 (基础功能):

  • 提供使用matplotlib进行基本绘图的接口。
  • 可以设置节点位置、颜色、大小、标签以及边的样式、宽度、颜色等。
  • 注意:对于高度定制化或交互式可视化,通常结合专门的库如matplotlib, pygraphviz, graph-tool, plotly, bokeh或Gephi(通过文件导出)使用。

3. 各种图类型Python代码实现

在这里插入图片描述

3.1 有向无环图(Directed acyclic graph, DAG)

指一个没有环的有向图。

def plot_DiGraph(edges, title="有向无环图", node_color='skyblue', figsize=(4, 3), seed=42):
    """
    绘制有向无环图

    参数:
        edges (list of tuples): 因果边,形如 [('A', 'B'), ('B', 'C')]
        title (str): 图标题
        node_color (str): 节点颜色
        figsize (tuple): 图像大小
        seed (int): 随机种子,控制布局稳定性

    返回:
        networkx.DiGraph: 构建的有向图对象
    """
    DAG = nx.DiGraph()
    DAG.add_edges_from(edges)
    plt.figure(figsize=figsize)
    pos = nx.spring_layout(DAG, seed=seed)
    nx.draw(DAG, pos, with_labels=True, node_color=node_color,
            node_size=2000, edge_color='gray', font_size=10)
    plt.title(title)
    plt.show()

    return DAG

edges_0 = [
    ('A', 'B'),
    ('C', 'B'),
    ('C', 'D'),
    ('B', 'D'),
    ('A', 'C'),
    ('D', 'A'),
]
DAG = plot_DiGraph(edges_0, title="有向无环图(DAG)")
edges_df = pd.DataFrame(DAG.edges(), columns=["Source", "Target"])
edges_df

在这里插入图片描述

3.2 无向图

核心特性

  • 无向性:所有边都没有方向,连接是双向的 (A, B) 等价于 (B, A) 表示对称关系(如好友关系、合作网络)
  • 简单图:不允许自环(节点不能连接自身) 相同节点间最多只有一条边(无多重边)
  • 灵活性:节点可以是任意可哈希对象(字符串、数字、元组、自定义对象等) 边可以携带任意属性字典

Python代码示例

def plot_Graph(nodes,edges, title="无向图", seed=18):
    """
    绘制无向图

    参数:
        nodes :节点,添加指定节点
        edges (list of tuples): 边,形如 [('A', 'B'), ('B', 'C')]
        title (str): 图标题
        node_color (str): 节点颜色
        figsize (tuple): 图像大小
        seed (int): 随机种子,控制布局稳定性

    返回:
        networkx.Graph: 构建的无向图对象
    """
    G = nx.Graph()
    G.add_nodes_from
本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值