毕业后,留存的屎山代码太过庞大,师弟师妹难以利用,现希望通过本文章将构建图结构的基本逻辑和方法讲清楚,希望能为大家提供一定的帮助。
关于图的基本原理和组成我就不过多赘述了,既然来看这篇文章,肯定是有初步了解的,我们直接进入代码工作。

图是一种方法,除了深度学习的领域应用之外,我相信利用图可以解决许多物理问题和逻辑问题。

需求

通过节点和边,利用图来表达一个管网在空间中的分布情况。

需求分析

1.“通过节点和边”

则我们的数据集构建应该是节点数据集或者边数据集,节点数据集需要利用“索引ID”来确认其邻接节点,边数据集合只需要对相同节点进行合并即可(因为如果没有合并或者说识别相同节点的话,构建出来的图将会成为n个分量,n是边的数量,如图所示)

两点重合处理示意图

2.表达在空间中的分布情况

这就要求需要节点再空间中的分布数据,即三维坐标。

确定字段

用于区分边的FID、用于确定边起点坐标的Start_X、Start_Y、Start_Z,用于确定边终点坐标的End_X、End_Y、End_Z。其实FID也可以不要,看自己的需求,因为边的形式可以表示为((Start_X,Start_Y,Start_Z),(End_X,End_Y,End_Z))数据集截图如下:

编写程序,构成图结构

#导入需要用的库
import pandas as pd
import networkx as nx


def drawgraphs(filenames):
    '''
    从多个CSV文件创建一个合并的NetworkX图对象。
    参数:filenames (list): 包含图数据的CSV文件路径列表
    '''
    G = nx.Graph()
    for filename in filenames:
        # 这一步是因为有时候文件解码会报错,添加几种解码方式
        try:
            df = pd.read_csv(filename, encoding='gbk')
        except UnicodeDecodeError:
            print(f"Error reading file {filename} with GBK encoding. Trying UTF-8 instead.")
            df = pd.read_csv(filename, encoding='utf-8')

        for index, row in df.iterrows():
            start_node = (row['Start_X'], row['Start_Y'], row['Start_Z'])
            end_node = (row['End_X'], row['End_Y'], row['End_Z'])
            #这里就是第一张图里面说的将重复的节点识别合并
            if start_node != end_node:
                # 这里是计算了每个边的空间长度
                l = np.linalg.norm(np.array(start_node) - np.array(end_node))
                # 这里就是依次循环将每一条边加入图中,并附上了一个属性即weight(距离权重)
                G.add_edge(start_node, end_node, weight=l)
                # 输出每一条边的情况(可以不输出,只是有助于理解代码)
                print(f"Added edge from {start_node} to {end_node} with length {l}")
        # 输出最终组成的图中边的条数(随意,可以不输出)
        print(f"Total edges so far: {G.number_of_edges()}")
        # 输出最终组成的图是否联通
        print(f"是否连通: {nx.is_connected(G)}")

    return G  

输出结果:表明图已经建立,且是联通的

编写程序,可视化形态图

可视化这部分我先不写,三维可视化的效果如下图所示,希望你可以用matplotlib先绘制一个二维平面的出来,后面我将补充二维和三维可视化的代码(三维和二维的可视化数据稍微有些区别,是因为二维是最新数据构成的)。

二维可视化效果
三维可视化的结果
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐