iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 使用 NetworkX
  • 637
分享到

Python 使用 NetworkX

pythonphp开发语言 2023-09-24 09:09:15 637人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

python 使用 NetworkX 说明:本篇文章主要讲述 Python 使用 networkx 绘制有向图; 1. 介绍&安装 NetworkX 是一个用于创建、操作和研究复杂网络的 Python

python 使用 NetworkX

说明:本篇文章主要讲述 Python 使用 networkx 绘制有向图;

1. 介绍&安装

NetworkX 是一个用于创建、操作和研究复杂网络的 Python 库。它提供了丰富的功能,可以帮助你创建、分析和可视化各种类型的网络,例如社交网络、WEB图、生物网络等。NetworkX 可以用来创建各种类型的网络,包括有向图无向图。它提供了各种方法来添加、删除和修改网络中的节点和边。你可以使用节点和边的属性来进一步描述网络的特性。

NetworkX 还提供了许多图的算法和分析工具。你可以使用这些工具来计算各种网络指标,比如节点的度、网络的直径、最短路径等。你还可以使用它来发现社区结构、进行图的聚类分析等。

除了功能强大的操作和分析工具,NetworkX还提供了多种方式来可视化网络。你可以使用它来绘制网络的节点和边,设置节点的颜色、尺寸和标签等。

总的来说,NetworkX是一个功能丰富、灵活易用的Python库,用于创建、操作和研究各种类型的复杂网络。无论你是在进行学术研究、数据分析还是网络可视化,NetworkX都是一个不错的选择。

安装

pip install networkx

2. 简单的有向图绘制

简单的类展示

import networkx as nx  # 导入 NetworkX 工具包# 创建 图G1 = nx.Graph()  # 创建:空的 无向图G2 = nx.DiGraph()  #创建:空的 有向图G3 = nx.MultiGraph()  #创建:空的 多图G4 = nx.MultiDiGraph()  #创建:空的 有向多图

三节点有向图的绘制

# -*- coding: utf-8 -*-import networkx as nximport matplotlib.pyplot as plt# 1. 创建有向图对象, 创建空的有向图的对象G = nx.DiGraph()# 2. 添加节点G.add_node('A')G.add_node('B')G.add_node('C')# 3. 添加有向边G.add_edge('A', 'B')G.add_edge('B', 'C')# 4. 进行图的绘制pos = nx.spring_layout(G)  # 选择布局算法;nx.draw(G, pos, with_labels=True)plt.show()

image-20230701225230056

绘制分支节点的有向图

# -*- coding: utf-8 -*-import networkx as nximport matplotlib.pyplot as plt# 1. 创建有向图对象, 创建空的有向图的对象G = nx.DiGraph()# 2. 添加节点G.add_node('A')G.add_node('B')G.add_node('C')G.add_node('D')G.add_node('E')# 3. 添加有向边G.add_edge('A', 'B')G.add_edge('B', 'C')G.add_edge('B', 'D')G.add_edge('C', 'E')# 4. 进行图的绘制pos = nx.spring_layout(G)  # 选择布局算法;nx.draw(G, pos, with_labels=True)plt.show()

image-20230701225411670

3.有向图的遍历

三节点有向图的遍历

# -*- coding: utf-8 -*-import networkx as nximport matplotlib.pyplot as plt# 1. 创建有向图对象, 创建空的有向图的对象G = nx.DiGraph()# 2. 添加节点G.add_node('A')G.add_node('B')G.add_node('C')# G.add_node('D')# G.add_node('E')# 3. 添加有向边G.add_edge('A', 'B')G.add_edge('B', 'C')# G.add_edge('B', 'D')# G.add_edge('C', 'E')# 4. 进行图的绘制pos = nx.spring_layout(G)  # 选择布局算法;nx.draw(G, pos, with_labels=True)plt.show()# 5. 有向图的遍历print(G.nodes)  # 节点列表, 输出节点 列表for node in G.nodes():    print("节点>>>", node)

image-20230701230149897

绘制分支节点图形的输出

# -*- coding: utf-8 -*-import networkx as nximport matplotlib.pyplot as plt# 1. 创建有向图对象, 创建空的有向图的对象G = nx.DiGraph()# 2. 添加节点G.add_node('A')G.add_node('B')G.add_node('C')G.add_node('D')G.add_node('E')# 3. 添加有向边G.add_edge('A', 'B')G.add_edge('B', 'C')G.add_edge('B', 'D')G.add_edge('C', 'E')# 4. 进行图的绘制pos = nx.spring_layout(G)  # 选择布局算法;nx.draw(G, pos, with_labels=True)plt.show()# 5. 有向图的遍历print(G.nodes)  # 节点列表# print(G.edges)  # 边列表, [('A', 'B'), ('B', 'C'), ('B', 'D'), ('C', 'E')]for node in G.nodes():    print("节点>>>", node)    in_degree = G.in_degree(node)    print("入度:", in_degree)    # 获取节点的出度    out_degree = G.out_degree(node)    print("出度:", out_degree)    # 获取节点的邻居节点    neighbors = G.neighbors(node)    print("邻居节点:", list(neighbors))

image-20230701230547282

4.带权重的边

本章节的内容主要展示带权重的边的绘制,并且求取出最大值和最小值;

# -*- coding: utf-8 -*-import networkx as nximport matplotlib.pyplot as plt# 创建有向图G = nx.DiGraph()# 直接创建边, 自动添加两个节点, 并且设置边的权重G.add_edge('A', 'B', weight=3)G.add_edge('B', 'C', weight=5)G.add_edge('C', 'D', weight=2)G.add_edge('C', 'E', weight=5)pos = nx.spring_layout(G)nx.draw(G, pos, with_labels=True)# 获取边的权重labels = nx.get_edge_attributes(G, 'weight')# 绘制带有权重的边nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)plt.show()# 获取边的权重值列表weights = nx.get_edge_attributes(G, 'weight').values()print("边的权重值列表>>>", weights)max_weight = max(weights)min_weight = min(weights)print("最大权重的边:", max_weight)print("最小权重的边:", min_weight)

image-20230701231846552

求取图形中得最短路径

# -*- coding: utf-8 -*-import networkx as nximport matplotlib.pyplot as pltdef get_shortest_path(graph, source, target):    try:        shortest_path = nx.shortest_path(graph, source, target)        return shortest_path    except nx.exception.NetworkXNoPath:        return "不存在最短路径"def get_longest_path(graph, source, target):    all_paths = nx.all_simple_paths(graph, source, target)    longest_path = max(all_paths, key=len)    return longest_path# 创建有向图G = nx.DiGraph()G.add_edge('A', 'B')G.add_edge('A', 'C')G.add_edge('B', 'C')G.add_edge('B', 'D')G.add_edge('C', 'D')pos = nx.spring_layout(G)  # 选择布局算法;nx.draw(G, pos, with_labels=True)plt.show()# 求取最短路径shortest_path = get_shortest_path(G, 'A', 'D')print("最短路径:", shortest_path)# 求取最长路径longest_path = get_longest_path(G, 'A', 'D')print("最长路径:", longest_path)

image-20230701232635408

按照权重求最短路径&最长路径

# -*- coding: utf-8 -*-import networkx as nximport matplotlib.pyplot as plt# 创建有向带权重图G = nx.DiGraph()G.add_edge('A', 'B', weight=3)G.add_edge('A', 'C', weight=5)G.add_edge('B', 'C', weight=2)G.add_edge('B', 'D', weight=4)G.add_edge('C', 'D', weight=1)pos = nx.spring_layout(G)nx.draw(G, pos, with_labels=True)# 获取边的权重labels = nx.get_edge_attributes(G, 'weight')# 绘制带有权重的边nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)plt.show()# 按照权重求取最短路径shortest_path = nx.dijkstra_path(G, 'A', 'D', weight='weight')shortest_distance = nx.dijkstra_path_length(G, 'A', 'D', weight='weight')print("最短路径:", shortest_path)print("最短距离:", shortest_distance)

image-20230701232954856

import networkx as nx# 创建有向带权重图G = nx.DiGraph()G.add_edge('A', 'B', weight=3)G.add_edge('A', 'C', weight=5)G.add_edge('B', 'C', weight=2)G.add_edge('B', 'D', weight=4)G.add_edge('C', 'D', weight=1)# 将边的权重取相反数G_neg = nx.DiGraph()for u, v, data in G.edges(data=True):    G_neg.add_edge(u, v, weight=-data['weight'])# 按照权重取相反数的图中求取最短路径longest_path = nx.dijkstra_path(G_neg, 'A', 'D', weight='weight')longest_distance = -nx.dijkstra_path_length(G_neg, 'A', 'D', weight='weight')print("最长路径:", longest_path)print("最长距离:", longest_distance)

5.JSON 数据的转换

**说明:**前后端交互的时候通常传回的时候的 json 格式化后的数据,通常需要构建一下,因此最好创建一个统一的类进行封装。

# -*- coding: utf-8 -*-"""图的封装;"""import networkx as nximport matplotlib.pyplot as pltclass GraphDict(object):    """有向图的构造;    """    def __init__(self):        """初始化的封装;        """        self.graph = None  # 有向图的构建        self.graph_weight = None  # 有向图带权重    def dict_to_graph(self, data: list):        """        图的字典模式;        :param data:        :return:        example:            data=[{              source: 'Node 1',              target: 'Node 3'            },            {              source: 'Node 2',              target: 'Node 3'            },            {              source: 'Node 2',              target: 'Node 4'            },            {              source: 'Node 1',              target: 'Node 4'            }]        """        graph = nx.DiGraph()  # 创建有向图        # 循环添加边, 直接添加上节点        for item in data:            graph.add_edge(item.get('source'), item.get("target"))        # 赋值并返回        self.graph = graph        return graph    def dict_to_graph_weight(self, data: list):        """        图的字典模式, 带权重;        :param data:        :return:        example:            data = [                {                  source: 'Node 1',                  target: 'Node 3',                  weight: 5                },                {                  source: 'Node 2',                  target: 'Node 3',                  weight: 3,                },                {                  source: 'Node 2',                  target: 'Node 4',                  weight: 5,                },                {                  source: 'Node 1',                  target: 'Node 4',                  weight: 5                }            ]        """        graph = nx.DiGraph()  # 创建有向图        # 循环添加边, 直接添加上节点, 并且为边赋值上权重;        for item in data:            graph.add_edge(item.get('source'), item.get("target"), weight=item.get("weight"))        # 赋值并返回        self.graph_weight = graph        return graph    def graph_to_dict(self):        """        图的数据转换成为字典的数据;        :return:        """        assert self.graph is not None or self.graph_weight is not None, "必须首先通过该类创建一个有向图"        if self.graph is None:            edges = self.graph_weight.edges(data=True)            return [{"source": s, "target": t, "weight": w['weight']} for s, t, w in edges]        else:            edges = self.graph.edges()            return [{"source": s, "target": t} for s, t in edges]    def show(self):        """        有向图的显示;        :return:        """        assert self.graph is not None or self.graph_weight is not None, "必须首先通过该类创建一个有向图"        if self.graph is None:            pos = nx.spring_layout(self.graph_weight)            nx.draw(self.graph_weight, pos, with_labels=True)            labels = nx.get_edge_attributes(self.graph_weight, 'weight')            nx.draw_networkx_edge_labels(self.graph_weight, pos, edge_labels=labels)            plt.show()        else:            pos = nx.spring_layout(self.graph)            nx.draw(self.graph, pos, with_labels=True)            plt.show()    def to_png(self, name: str):        """        导出有向图的 png 图片;        :param name; str, 想要导出 png 图片的名称;        :return:        """        assert self.graph is not None or self.graph_weight is not None, "必须首先通过该类创建一个有向图"        if self.graph is None:            pos = nx.spring_layout(self.graph_weight)            nx.draw(self.graph_weight, pos, with_labels=True)            labels = nx.get_edge_attributes(self.graph_weight, 'weight')            nx.draw_networkx_edge_labels(self.graph_weight, pos, edge_labels=labels)            plt.savefig(name)        else:            pos = nx.spring_layout(self.graph)            nx.draw(self.graph, pos, with_labels=True)            plt.savefig(name)if __name__ == '__main__':    graph = GraphDict()    data = [        {            "source": 'Node 1',            "target": 'Node 3'        },        {            "source": 'Node 2',            "target": 'Node 3'        },        {            "source": 'Node 2',            "target": 'Node 4'        },        {            "source": 'Node 1',            "target": 'Node 4'        }]    data_weight = [        {            "source": 'Node 1',            "target": 'Node 3',            "weight": 3        },        {            "source": 'Node 2',            "target": 'Node 3',            "weight": 3        },        {            "source": 'Node 2',            "target": 'Node 4',            "weight": 3        },        {            "source": 'Node 1',            "target": 'Node 4',            "weight": 3        }]    # graph.dict_to_graph(data)    # graph.to_png("有向图的导出")    graph.dict_to_graph_weight(data_weight)    graph.to_png("权重")    v = graph.graph_to_dict()    print(v)

image-20230702110304161

继续努力,终成大器;

来源地址:https://blog.csdn.net/m0_61970162/article/details/131498998

--结束END--

本文标题: Python 使用 NetworkX

本文链接: https://www.lsjlt.com/news/416796.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python 使用 NetworkX
    Python 使用 NetworkX 说明:本篇文章主要讲述 python 使用 networkx 绘制有向图; 1. 介绍&安装 NetworkX 是一个用于创建、操作和研究复杂网络的 Python...
    99+
    2023-09-24
    python php 开发语言
  • Python中的Networkx的基本使用
    目录1. 安装Networkx2. Networkx的基本使用2.1 导入networkx2.2 创建Graph2.3 给Graph添加边2.4 Graph基本信息获取2.5 Gra...
    99+
    2023-02-14
    Python中Networkx Python Networkx详解 Python中Networkx使用
  • python中networkx函数的具体使用
    目录1. 介绍1.1 前言1.2 图的类型(Graph Types)1.3 常用方法2. 代码示例1. 介绍 1.1 前言 NetworkX是复杂网络研究领域中的常用Python包。...
    99+
    2023-02-14
    python networkx使用 python networkx
  • 如何使用python中的networkx来生成一个图
    目录python networkx来生成一个图networkx随机图生成总结python networkx来生成一个图 使用python提供的第三方的库networkx,networ...
    99+
    2022-12-16
    python networkx networkx生成一个图 python networkx生成图
  • python复杂网络分析库NetworkX
    文章目录 1.Networkx简介2.图的类型(Graphs)3.图的创建(Graph Creation)4.图的属性(Graph Reporting)5.图算法(Algorithms)6.图...
    99+
    2023-10-23
    python 复杂网络 图算法
  • NetWorkX使用方法及nx.draw()相关参数解读
    目录代码networkx–nx.draw()参数运行样式运用布局添加文本总结networkx在02年5月产生,是用python语言编写的软件包,便于用户对复杂网络进行创建...
    99+
    2022-12-16
    NetWorkX使用方法 nx.draw()参数 使用NetWorkX
  • Python利用networkx画图绘制Les Misérables人物关系
    目录数据集介绍数据处理画图networkx自带的数据集完整代码数据集介绍 《悲惨世界》中的人物关系图,图中共77个节点、254条边。 数据集截图: 打开README文件: Les ...
    99+
    2024-04-02
  • python NetworkX库生成并绘制带权无向图
    目录1. 随机图生成2. 2D布局可视化3. 3D布局可视化参考NetworkX是一个非常强大的网络科学工具,它封装了图的数据结构和许多经典图算法,也内置了许多可视化函数可供调用。 ...
    99+
    2024-04-02
  • Python怎么利用networkx画图绘制Les Misérables人物关系
    这篇文章主要介绍“Python怎么利用networkx画图绘制Les Misérables人物关系”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么利用networkx画图绘制...
    99+
    2023-06-30
  • 【Python】Python使用redis
    转自:http://www.diybl.com/course/3_program/python/20110510/555370.html #1、安装  好吧,我承认我只会最简单的安装&n...
    99+
    2024-04-02
  • Python 使用python-kafk
    使用python-kafka类库开发kafka生产者&消费者&客户端   By: 授客 QQ:1033553122       1.测试环境 python 3.4   zookeeper-3.4.13.tar.gz 下载地...
    99+
    2023-01-30
    Python python kafk
  • Python使用cookie
    为什么要使用Cookie呢?Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用U...
    99+
    2023-01-31
    Python cookie
  • python使用setsockopt
    默认的socket选项不够用的时候,就必须要使用setsockopt来调整。就是使用setsockopt。 首先看一下socket的setsockopt 函数的定义: socket.setsockopt(level,optname, ...
    99+
    2023-01-31
    python setsockopt
  • python paramiko 使用
       python 下的paramiko功能很之强大。我们所熟悉的Ansible就是用paramiko编写。paramiko主要是通过ssh协议对远程主机的管理。比如:执行远程主机的CLI、上传和下载文件等。1.通过使用paramiko 远...
    99+
    2023-01-31
    python paramiko
  • Python 使用 matplotlib
    3D图形在数据分析、数据建模、图形和图像处理等领域中都有着广泛的应用,下面将给大家介绍一下如何在Python中使用 matplotlib进行3D图形的绘制,包括3D散点、3D表面、3D轮廓、3D直线(曲线)以及3D文字等的绘制。 准备工作...
    99+
    2023-01-31
    Python matplotlib
  • python使用pymsql
    pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。1、执行SQL#!/usr/bin/env python# -*- coding:utf-8 -*-import pymysql# 创建连接conn = ...
    99+
    2023-01-31
    python pymsql
  • python 使用sqlite3
    Sqlite是一个轻量级的数据库,类似于Access.一、 安装Python 2.5开始提供了对sqlite的支持,带有sqlite3库.没有sqli...
    99+
    2023-01-31
    python
  • Python Urllib2使用
    Python Urllib2使用我们先看下Python对于Urllib2的解释:Intro代码  urllib2:An extensible library for opening URLs using a variety of proto...
    99+
    2023-01-31
    Python
  • python paramiko使用
     http://www.lag.net/paramiko/ Working with paramiko SSHClient is the main class provided by the paramkio mod...
    99+
    2023-01-31
    python paramiko
  • python PIL.Image使用
    一、 基本概念 通道每张图片由一个或多个通道构成RGB图像为例,每张图片由3个通道构成,即R通道,G通道,B通道。对于灰度图像,则只有一个通道。获取图像的通道数量和名称,可以由方法PIL.Image.getbands()获取,此方法返...
    99+
    2023-01-31
    python PIL Image
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作