利用python(networkx库)画带权&不带权有向图、无向图

2023-11-20

  当我们处理完几百几千乃至上万的图论数据后总是不可避免地要对数据进行数据可视化等的分析
  ,甚至要在画好图的基础上进行一些上层修改,增加连线,高亮特殊点和路径。比如说在Dijks-
  tra和  Floyd算法的时候,为了体现出它们的区别(Dijkstra是以起始点为中心向外扩散层层
  遍历得到迷宫式推  进最短路径,而 Floyd是考虑i,j之间分为的过点和不过点分类求最小的
  区别);或者生成最小二叉树的kruscal和prim算法,分别得出最小网络问题。都需要我们对网
  络节点进行归类和数据可视化。

在这里插入图片描述
具体算法介绍可以移步:传送门

效果展示

老规矩先上效果:
在我的数据中有80个节点,我希望挑出其中路径上比较重要的节点,断了之后回会对车流量的畅通造成极大的影响,于是我希望将重要节点表示出来并且将它联通的大村庄进行编号分组在这里插入图片描述
编号之后的效果如下:
在这里插入图片描述
下列绿色为重要的交通枢纽,黄色为普通节点,其他同颜色的表示是一个地点群的村庄。
考虑下一个因素,道路被破坏的情况,我利用算法算出在一定置信概率的情况下能继续保持能互相通行的解决办法,将交通网络进行增补形成环状交通枢纽的方案,之后的效果如下:在这里插入图片描述
标为蓝色的路线即为新增的村庄间道路。
做完这些已头秃。。在这里插入图片描述
这个是利用无向图函数可以达到的目的。

分段代码

无向图代码如下:
很多同学说Graph_Matrix没有给出,其实这个在大佬的原博客里是给出的,是一个类名,后来的可以借鉴一下!!


class Graph_Matrix:
    """
    Adjacency Matrix
    """
    def __init__(self, vertices=[], matrix=[]):
        """

        :param vertices:a dict with vertex id and index of matrix , such as {vertex:index}
        :param matrix: a matrix
        """
        self.matrix = matrix
        self.edges_dict = {}  # {(tail, head):weight}
        self.edges_array = []  # (tail, head, weight)
        self.vertices = vertices
        self.num_edges = 0

        # if provide adjacency matrix then create the edges list
        if len(matrix) > 0:
            if len(vertices) != len(matrix):
                raise IndexError
            self.edges = self.getAllEdges()
            self.num_edges = len(self.edges)

        # if do not provide a adjacency matrix, but provide the vertices list, build a matrix with 0
        elif len(vertices) > 0:
            self.matrix = [[0 for col in range(len(vertices))] for row in range(len(vertices))]

        self.num_vertices = len(self.matrix)

    def isOutRange(self, x):
        try:
            if x >= self.num_vertices or x <= 0:
                raise IndexError
        except IndexError:
            print("节点下标出界")

    def isEmpty(self):
        if self.num_vertices == 0:
            self.num_vertices = len(self.matrix)
        return self.num_vertices == 0

    def add_vertex(self, key):
        if key not in self.vertices:
            self.vertices[key] = len(self.vertices) + 1

        # add a vertex mean add a row and a column
        # add a column for every row
        for i in range(self.getVerticesNumbers()):
            self.matrix[i].append(0)

        self.num_vertices += 1

        nRow = [0] * self.num_vertices
        self.matrix.append(nRow)

    def getVertex(self, key):
        pass

    def add_edges_from_list(self, edges_list):  # edges_list : [(tail, head, weight),()]
        for i in range(len(edges_list)):
            self.add_edge(edges_list[i][0], edges_list[i][1], edges_list[i][2], )

    def add_edge(self, tail, head, cost=0):
        # if self.vertices.index(tail) >= 0:
        #   self.addVertex(tail)
        if tail not in self.vertices:
            self.add_vertex(tail)
        # if self.vertices.index(head) >= 0:
        #   self.addVertex(head)
        if head not in self.vertices:
            self.add_vertex(head)

        # for directory matrix
        self.matrix[self.vertices.index(tail)][self.vertices.index(head)] = cost
        # for non-directory matrix
        # self.matrix[self.vertices.index(fromV)][self.vertices.index(toV)] = \
        #   self.matrix[self.vertices.index(toV)][self.vertices.index(fromV)] = cost

        self.edges_dict[(tail, head)] = cost
        self.edges_array.append((tail, head, cost))
        self.num_edges = len(self.edges_dict)

    def getEdges(self, V):
        pass

    def getVerticesNumbers(self):
        if self.num_vertices == 0:
            self.num_vertices = len(self.matrix)
        return self.num_vertices

    def getAllVertices(self):
        return self.vertices

    def getAllEdges(self):
        for i in range(len(self.matrix)):
            for j in range(len(self.matrix)):
                if 0 < self.matrix[i][j] < float('inf'):
                    self.edges_dict[self.vertices[i], self.vertices[j]] = self.matrix[i][j]
                    self.edges_array.append([self.vertices[i], self.vertices[j], self.matrix[i][j]])

        return self.edges_array

    def __repr__(self):
        return str(''.join(str(i) for i in self.matrix))

    def to_do_vertex(self, i):
        print('vertex: %s' % (self.vertices[i]))

    def to_do_edge(self, w, k):
        print('edge tail: %s, edge head: %s, weight: %s' % (self.vertices[w], self.vertices[k], str(self.matrix[w][k])))

def create_undirected_matrix(my_graph,matrix):
nodes = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 
             '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', 
             '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', 
             '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', 
             '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', 
             '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', 
             '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', 
             '71', '72', '73', '74', '75', '76', '77', '78', '79', '80',              
             ]
	my_graph = Graph_Matrix(nodes, matrix)
    print(my_graph)
    return my_graph       

有向图代码如下:

def create_directed_matrix(my_graph):#二维数组生成有向图
    nodes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
    inf = float('inf')
    matrix = [[0, 2, 1, 3, 9, 4, inf, inf],  # a
              [inf, 0, 4, inf, 3, inf, inf, inf],  # b
              [inf, inf, 0, 8, inf, inf, inf, inf],  # c
              [inf, inf, inf, 0, 7, inf, inf, inf],  # d
              [inf, inf, inf, inf, 0, 5, inf, inf],  # e
              [inf, inf, 2, inf, inf, 0, 2, 2],  # f
              [inf, inf, inf, inf, inf, 1, 0, 6],  # g
              [inf, inf, inf, inf, inf, 9, 8, 0]]  # h

    my_graph = Graph_Matrix(nodes, matrix)
    print(my_graph)
    return my_graph

带权值的有向图代码如下:

def create_directed_graph_from_edges(my_graph):#用边生成有向图
    nodes = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
    edge_list = [('A', 'F', 9), ('A', 'B', 10), ('A', 'G', 15), ('B', 'F', 2),
                 ('G', 'F', 3), ('G', 'E', 12), ('G', 'C', 10), ('C', 'E', 1),
                 ('E', 'D', 7)]

    my_graph = Graph_Matrix(nodes)
    my_graph.add_edges_from_list(edge_list)
    print(my_graph)
    return my_graph

以上是参考大神思想出来的图的creat
但是当数据过大之后代入数据比较麻烦,于是我写了数据的导入函数,你可以实现把自己要导入的数据存入一个excel的不同子数据表中,通过调整不同带入参数实现变化数据的导入,本人是通过采用matlab循环处理数据导入excel中:实现代码如下:

def matrix(path):#读取excel表格里的数据
    table = xlrd.open_workbook(path).sheets()[6]    # 获取第6个sheet表
    row = table.nrows                               # 行数
    col = table.ncols                               # 列数
    datamatrix = np.zeros((row, col))               # 生成一个nrows行ncols列,且元素均为0的初始矩阵
    for x in range(col):
        try:
            cols = np.matrix(table.col_values(x))   # 把list转换为矩阵进行矩阵操作
            datamatrix[:, x] = cols                 # 按列把数据存进矩阵中
        except:
            print(x)
            
    print(datamatrix.shape)
    return datamatrix

各类图的显示代码如下:

def draw_undircted_graph(my_graph):#显示无向图
    G = nx.Graph()  # 建立一个空的无向图G
    for node in my_graph.vertices:
        G.add_node(str(node))
    for edge in my_graph.edges:
        G.add_edge(str(edge[0]), str(edge[1]))

    print("nodes:", G.nodes())  # 输出全部的节点: [1, 2, 3]
    print("edges:", G.edges())  # 输出全部的边:[(2, 3)]
    print("number of edges:", G.number_of_edges())  # 输出边的数量:1
    
    nx.draw(G, node_color = 'b',edge_color = 'r',with_labels=True)
    plt.savefig("undirected_graph.png")
    plt.show()

def draw_directed_graph(my_graph):#显示有向图,带权
    G = nx.DiGraph()  # 建立一个空的无向图G
    for node in my_graph.vertices:
        G.add_node(str(node))
    G.add_weighted_edges_from(my_graph.edges_array)

    print("nodes:", G.nodes())  # 输出全部的节点
    print("edges:", G.edges())  # 输出全部的边
    print("number of edges:", G.number_of_edges())  # 输出边的数量
    nx.draw(G, node_color = 'b',edge_color = 'r',with_labels=True)
    pos = spring_layout(G)
    plt.savefig("directed_graph.png")
    plt.show()

关于函数nx.draw的一点解释,nx.draw在库中的用法解释如下

"""Draw the graph G with Matplotlib.

    Draw the graph as a simple representation with no node
    labels or edge labels and using the full Matplotlib figure area
    and no axis labels by default.  See draw_networkx() for more
    full-featured drawing that allows title, axis labels etc.

    Parameters
    ----------
    G : graph
       A networkx graph

    pos : dictionary, optional
       A dictionary with nodes as keys and positions as values.
       If not specified a spring layout positioning will be computed.
       See :py:mod:`networkx.drawing.layout` for functions that
       compute node positions.

    ax : Matplotlib Axes object, optional
       Draw the graph in specified Matplotlib axes.

    kwds : optional keywords
       See networkx.draw_networkx() for a description of optional keywords.

    Examples
    --------
    >>> G = nx.dodecahedral_graph()
    >>> nx.draw(G)
    >>> nx.draw(G, pos=nx.spring_layout(G))  # use spring layout

    See Also
    --------
    draw_networkx()
    draw_networkx_nodes()
    draw_networkx_edges()
    draw_networkx_labels()
    draw_networkx_edge_labels()

    Notes
    -----
    This function has the same name as pylab.draw and pyplot.draw
    so beware when using `from networkx import *`

    since you might overwrite the pylab.draw function.

    With pyplot use

    >>> import matplotlib.pyplot as plt
    >>> import networkx as nx
    >>> G = nx.dodecahedral_graph()
    >>> nx.draw(G)  # networkx draw()
    >>> plt.draw()  # pyplot draw()

    Also see the NetworkX drawing examples at
    https://networkx.github.io/documentation/latest/auto_examples/index.html
    """

即你要对:

  • pos:字典–键值对进行定义,可选 以节点为键,位置为值的字典。
    -如果未指定,将计算弹簧布局定位。

  • 对于函数计算节点位置请参见:py:mod:网络X.drawing.layout ax:Matplotlib Axes对象(可选)

  • 还可以在指定的Matplotlib轴上绘制图形。
    -kwds:可选关键字

nx.draw(G,pos = nx.random_layout(G),node_color = 'b',edge_color = 'r',with_labels = True,font_size =18,node_size =20)
  • pos 指的是布局 主要有spring_layout , random_layout,circle_layout,shell_layout。node_color指节点颜色,有rbykw ,同理edge_color.表示边的颜色。
  • with_labels指节点是否显示名字,size表示大小,font_color表示字的颜色。
    在主函数中进行函数调用即可:
if __name__=='__main__':
    path = "E:\\my Python学习\\project test\\prac1\\pic\\pic\\data1.xls"
    datamatrix = matrix(path)
    my_graph=Graph_Matrix()
    created_graph=create_undirected_matrix(my_graph,datamatrix)
    draw_undircted_graph(created_graph)

全部源代码:传送门

“你是谁?”

“一个看帖子的人。”

“看帖子不点赞啊?”

“你点赞吗?”

“当然点了。”

“我也会点。”

“谁会把经验写在帖子里。”

“写在帖子里的那能叫经验贴?”

“上流!”

                                   cheer!!!

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用python(networkx库)画带权&不带权有向图、无向图 的相关文章

  • 列出类的所有实例

    我编写了一个 Python 模块 其中有几个类继承自一个名为MasterBlock 我想在脚本中导入此模块 创建这些类的多个实例 然后获取该类的所有子级的所有现有实例的列表MasterBlock班级 我找到了一些解决方案vars Block
  • 以类似字典的方式将新项目添加到某些结构化数组中

    我想扩展 numpy 中的结构化数组对象 以便我可以轻松添加新元素 例如 对于一个简单的结构化数组 gt gt gt import numpy as np gt gt gt x np ndarray 2 dtype names A B fo
  • MySQL 的 read_sql() 非常慢

    我将 MySQL 与 pandas 和 sqlalchemy 一起使用 然而 它的速度非常慢 对于一个包含 1100 万行的表 一个简单的查询需要 11 分钟以上才能完成 哪些行动可以改善这种表现 提到的表没有主键 并且仅由一列索引 fro
  • 如何/在哪里发布 Python 包

    如果一个人创建了一个有用的 Python 包 那么如何 在哪里发布 宣传它以供其他人使用 我已经把它放到了 github 上 但几周后谷歌也没有找到它 包装整洁完整 我制作它供我个人使用 不与其他人分享将是一种耻辱 这是 PyPI 指南 h
  • 识别 Windows 版本

    我正在编写一个打印出详细 Windows 版本信息的函数 输出可能是这样的元组 32bit XP Professional SP3 English 它将支持 Windows XP 及更高版本 我一直坚持获取 Windows 版本 例如 专业
  • 使用python同时播放两个正弦音

    我正在使用 python 来播放正弦音 音调基于计算机的内部时间 以分钟为单位 但我想根据秒同时播放一个音调 以获得和谐或双重的声音 这就是我到目前为止所拥有的 有人能指出我正确的方向吗 from struct import pack fr
  • 无法将 python 数据框中的列类型从 object 转换为 str

    我已经下载了一个csv文件 然后将其读取到python dataframe 现在所有4列都有对象类型 我想将它们转换为str类型 现在dtypes的结果如下 Name object Position Title object Departm
  • 从文件中读取单词并放入列表中

    本质上 我有一个巨大的文件 所有文件包含每行多个单词 每个单词用空格分隔 有点像这样 WORD WORD WORD WORD ANOTHER WORD SCRABBLE BLAH YES NO 我想要做的是将文件中的所有单词放入一个巨大的列
  • “分页文件太小,无法完成此操作”尝试训练 YOLOv5 对象检测模型时出错

    我有大约 50000 个图像和注释文件用于训练 YOLOv5 对象检测模型 我在另一台计算机上仅使用 CPU 训练模型没有问题 但需要太长时间 因此我需要 GPU 训练 我的问题是 当我尝试使用 GPU 进行训练时 我不断收到此错误 OSE
  • Python 对象属性 - 访问方法

    假设我有一个具有某些属性的类 在 Pythonic OOP 中 如何访问这些属性是最好的 就像obj attr 或者也许编写 get 访问器 此类事物可接受的命名风格是什么 Edit 您能否详细说明使用单下划线或双前导下划线命名属性的最佳实
  • 将 Matlab MEX 文件中的函数直接嵌入到 Python 中

    我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些仿真结果 当然没有可用的源代码 Matlab 的接口实际上非常简单 因为只有一个函数 返回一个 Matlab 结构体 我想知道是否有任何方法可以直接从Python调用M
  • 调试 python Web 服务

    我正在使用找到的说明here http www diveintopython net http web services user agent html 尝试检查发送到我的网络服务器的 HTTP 命令 但是 我没有看到按照教程中的建议在控制
  • 如何从列表中删除“\xe2”

    我是 python 新手 正在使用它在我的项目中使用 nltk 对从网页获得的原始数据进行单词标记后 我得到了一个包含 xe2 xe3 x98 等的列表 但是我不需要这些并想删除它们 我只是尝试过 if x in a and if a st
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • 计算素数并附加到列表

    我最近开始尝试使用 python 解决 Euler 项目的问题 并且在尝试计算素数并将其附加到列表中时遇到了这个障碍 我编写了以下代码 但我很困惑为什么它在运行时不输出任何内容 import math primes def isPrime
  • 在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

    编码社区的成员比我更聪明 我有一个 python 问题要问你们 我正在尝试优化一个 python 脚本 该脚本 除其他外 返回子进程执行和终止的挂钟时间 我想我已经接近这样的事情了 startTime time time process s
  • Tensorflow:提要字典错误:您必须为占位符张量提供值

    我有一个错误 我无法找出原因 这是代码 with tf Graph as default global step tf Variable 0 trainable False images tf placeholder tf float32
  • Python中如何实现相对导入

    考虑 stuff init py mylib py Foo init py main py foo init py script py script py想要进口mylib py 这只是一个示例 但实际上我只想在父目录中进行模块的相对导入
  • mypy 错误:赋值中的类型不兼容(表达式的类型为“Dict[, ]”,目标的类型为“List[str]”)

    我尝试过了实例化一个空字典在现有字典的第二层上 然后为其分配一个键值对 但 MyPy 会抛出错误 这是一个最小的示例 当激活 MyPy 检查时它将重现它 result Test something result key result key
  • 张量流多元线性回归不收敛

    我正在尝试使用张量流训练具有正则化的多元线性回归模型 由于某种原因 我无法获取以下代码的训练部分来计算我想要用于梯度下降更新的误差 我在设置图表时做错了什么吗 def normalize data matrix averages np av

随机推荐

  • C++ MFC 导出ListControl数据到Excel

    一 导入对应的类 二 开启线程 void CLDITxtQueryDlg OnBnClickedBnExportToXLS TODO 在此添加控件通知处理程序代码 if ui ListCtrlDataResult GetItemCount
  • 并发编程 (6)一不小心就死锁了,怎么办?

    在上一篇文章中 我们用 Account class 作为互斥锁 来解决银行业务里面的转账问题 虽然这个方案不存在并发问题 但是所有账户的转账操作都是串行的 例如账户 A 转账户 B 账户 C 转账户 D 这两个转账操作现实世界里是可以并行的
  • 机器学习之LDA算法

    目录 LDA算法 LDA目标 LDA原理推导 LDA除法模型 LDA减法模型 LDA除法正则模型 LDA减法正则模型 证明 St Sw Sb LDA算法流程 LDA优点 LDA缺点 基于LDA的人脸识别 LDA算法 线性判别分析 linea
  • 2022Java面试题大全(整理版)面试题附答案详解,最全面详细

    目录 JAVA八股文 Java基础 String 和StringBuffer和 StringBuilder的区别 sleep 区间wait 区间有什么区别 Object 中有哪些方法 其中clone 怎么实现一个对象的克隆 Java如何实现
  • 安装MySQL出现Job for mysqld.service failed because the control process exited with error code

    这是因为无法再次初始化 解决办法 rm rf var lib mysql 然后重启service
  • 解决使用EasyPoi导入读取日期格式列获取值为null

    最近在做导入的时候发现 使用EasyPoi读取的日期值为null 这是我的Excel数据 如图 只是设置了列格式 我这里使用的是注解bean的方式解析读取 Map自由导入也尝试过 得到的结果都是null bean定义如下 Data Buil
  • 导出离散傅里叶变换(DFT)的两种方法

    1 原理部分 在这里首先确定DFT的对象为一个有限长的离散非周期序列 这主要因为计算机处理的都是有限长的离散序列 如果你要处理的序列本身不是离散非周期的序列 可以通过截取或者离散化等方法获得所需的有限长的离散非周期序列 对于有限长的离散非周
  • 第三周作业 token防爆破 (基于pikachu平台)burp token的暴力破解

    一 什么是token 简单的说token是由服务端生成的一串字符串 作为客户端向服务端请求的一个标识 在前端使用用户名 密码向服务端发送请求认证 服务端认证成功 那么在服务端会返回token给前端 前端在每次请求时会带上服务端发来的toke
  • SQL实现次日、三日及七日用户留存率的计算

    本篇博客学习如何用SQL来实现次日 三日及七日留存率的计算 假设有一个表 role login back 有字段 event time表示登陆日期时间和device id表示设备ID event time device id 2020 01
  • 【Flowable】Flowable工作流教程

    开始 Flowable是什么 Flowable是一个使用Java编写的轻量级业务流程引擎 Flowable流程引擎可用于部署BPMN 2 0流程定义 用于定义流程的行业XML标准 创建这些流程定义的流程实例 进行查询 访问运行中或历史的流程
  • Fedora 34成哑巴了?

    原由 前几天刚更新了Fedora34 完全沉浸在Gnome40的喜悦中 但是今天用耳机听Apple Music的时候完全傻了 音量控制旋钮调了半天也没有声音 难道声卡坏了 于是 我试探性的用Parrot下的FireFox听听网易云音乐 结果
  • 基于Matlab的故障检测的核PCA轮廓图

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 早期故障监测在大型工业工厂中变得非常重要 因为早期故障的早期检测有助于避免重大工厂故
  • Java 中do...while()的使用

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 do while语句 基本格式 do 循环体语句 while 条件判断语句 完整格式 初始化语句 do 循环体语句 条件控制语句 whi
  • 3. 从0开始学ARM-ARM模式、寄存器、流水线

    关于ARM的一些基本概念 大家可以参考我之前的文章 到底什么是Cortex ARMv8 arm架构 ARM指令集 soc 一文帮你梳理基础概念 科普 关于ARM指令用到的IDE开发环境可以参考下面这篇文章 1 从0开始学ARM 安装Keil
  • Python爬虫被封ip解决方案

    在使用 Python 程序进行网络爬虫开发时 可能因以下原因导致被封 IP 或封禁爬虫程序 1 频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次 从而对目标网站造成较大的负担和压力 这种行为容易引起目标网站的注意并被封禁IP或限制访
  • python 文件、文件夹和路径操作笔记

    记录python关于文件夹 文件和路径的一些常用操作 方便用时查询 常用的函数备注 os listdir 列出文件夹中所有文件 os path splitext 获取文件的后缀名 返回list 后缀在list 1 中 os path joi
  • 解决win10应用程序图标丢失问题

    1 问题 sublime 软件图标莫名其妙不显示 2 解决办法 1 进入cmd命令提示符 2 输入如下内容 taskkill im explorer exe f cd d userprofile appdata local del icon
  • 数据库之MySQL大全

    目录 1 MySQL数据库概述 2 MySQL的安装 Install MySQL 3 MySQL的配置 4 E R模型 5 创建数据库 6 数据类型 7 创建数据表 8 修改数据表 9 数据表约束 非空与默认值 10 数据表约束 唯一键与自
  • In-Context Retrieval-Augmented Language Models

    本文是LLM系列文章 针对 In Context Retrieval Augmented Language Models 的翻译 上下文检索增强语言模型 摘要 1 引言 2 相关工作 3 我们的框架 4 实验细节 5 具有现成检索器的上下文
  • 利用python(networkx库)画带权&不带权有向图、无向图

    利用python networkx库 画带权 不带权有向图 无向图 效果展示 分段代码 全部源代码 传送门 https download csdn net download weixin 44978992 12719404 当我们处理完几百