使用 graph_tool 绘制网络关系图

news2025/1/21 18:39:43

目标

使用pythongraph_tool包,根据以下表格,生成网络关系图。

采样方法大类小类
低空遥感解译地面裸土地,人工地面
地面影像解译水生植物水葫芦,荷叶,苦草,黑藻,水华,水白菜
RTK测量禾本植物狗牙根,华克拉莎,斑茅,苔草,芦苇,芦竹,杂茅
RTK测量风箱树,马甲子
RTK测量灌木车筒竹,泰竹,凤尾竹
RTK测量乔木旱柳,垂柳,桂花,乌桕,樟树,枫香,银杏,桉树,楝,榆树
低空遥感解译水稻已收割,已焚烧,禾苗
低空遥感解译菜地铺草,菜苗
地面影像解译景观树景观乔木,景观灌木
低空遥感解译人造物房屋,木桥,,车辆

请添加图片描述

简介

Graph-tool 是一个高效的Python模块,用于图形 (又名网络)的操作和统计分析。 与大多数具有类似功能的其他 Python 模块相反,核心数据结构和算法是用C++实现的,广泛使用模板元编程,很大程度上基于Boost Graph Library。这赋予它与纯 C/C++ 库相当的 性能水平(在内存使用和计算时间方面)。

官网:https://graph-tool.skewed.de/
文档:https://graph-tool.skewed.de/static/doc/index.html
论坛:https://forum.skewed.de/c/graph-tool/5
GitLab:https://git.skewed.de/count0/graph-tool

该包的缺点也很明显:

  • 不支持windows
  • 文字不能换行(有人提到过,但作者摆了)https://git.skewed.de/count0/graph-tool/-/issues/549
  • 不能根据指定长宽比绘图

数据

sample.csv

采样方法 大类 小类
低空遥感解译 地面 裸土地,人工地面
地面影像解译 水生植物 水葫芦,荷叶,苦草,黑藻,水华,水白菜
RTK测量 禾本植物 狗牙根,华克拉莎,斑茅,苔草,芦苇,芦竹,杂茅
RTK测量 竹 风箱树,马甲子
RTK测量 灌木 车筒竹,泰竹,凤尾竹
RTK测量 乔木 旱柳,垂柳,桂花,乌桕,樟树,枫香,银杏,桉树,楝,榆树
低空遥感解译 水稻 已收割,已焚烧,禾苗
低空遥感解译 菜地 铺草,菜苗
地面影像解译 景观树 景观树,景观灌木
低空遥感解译 人造物 房屋,木桥,船,车

代码

import numpy as np
from graph_tool.all import *


# 2字中间加空格
def space_in_name(name):
    if len(name) == 2:
        return f'{name[0]}   {name[1]}'
    return name


# 需要重点突出的类别
def bold_in_name(v):
    if vname[v] in ['RTK测量', '桂花', '车筒竹', '华克拉莎', '水葫芦', '船']:
        vfweight[v] = 1
        vweight[v] = 0.5 * scale
        vfsize[v] = 16 * scale
        vsize[v] = 65 * scale
    else:
        vfweight[v] = 0
        vweight[v] = 1 * scale
        vfsize[v] = 12 * scale
        vsize[v] = 50 * scale


scale = 5   # 总体缩放控制
# 画一个图B->A
g = Graph()
g.set_directed(True)  # 设置为有向图
# 新建顶点属性
vname = g.new_vertex_property("string")  # 顶点名称
vweight = g.new_vertex_property("float")  # 顶点权重
vcolor = g.new_vertex_property("string")  # 顶点边框颜色
vfcolor = g.new_vertex_property("string")  # 顶点填充颜色
vsize = g.new_vertex_property("float")  # 顶点大小
vfsize = g.new_vertex_property("float")  # 顶点文字大小
vfweight = g.new_vertex_property("int")  # 顶点文字粗细 0:正常 1:粗体
# 新建边属性
ecolor = g.new_edge_property("string")  # 边颜色
emarker = g.new_edge_property("string")  # 边标记(箭头)


# 加载数据
data_path = '/home/dl/temp/sample.csv'
data = np.loadtxt(data_path, dtype=np.str_, delimiter=' ', skiprows=1)
list_a = data[:, 0].tolist()
list_b = data[:, 1].tolist()
list_c = data[:, 2].tolist()
# 第一列去重,第三列分割+去重
set_a = list(set(list_a))
list_c = [i.split(',') for i in list_c]
set_c = list(set([j for i in list_c for j in i]))


# 添加顶点
v_a = []
for i in set_a:
    # 添加顶点
    v = g.add_vertex()
    # 设置顶点属性
    vname[v] = space_in_name(i)
    vcolor[v] = "red"
    vfcolor[v] = "lightpink"
    bold_in_name(v)
    vsize[v] = vsize[v] * 1.5
    v_a.append(v)

v_b = []
for i in list_b:
    v = g.add_vertex()
    vname[v] = space_in_name(i)
    vcolor[v] = "orange"
    vfcolor[v] = "lightyellow"
    bold_in_name(v)
    vsize[v] = vsize[v] * 1.2
    v_b.append(v)

v_c = []
for i in set_c:
    v = g.add_vertex()
    vname[v] = space_in_name(i)
    vcolor[v] = "green"
    vfcolor[v] = "lightgreen"
    bold_in_name(v)
    v_c.append(v)

# 添加边 a->b
for i in range(len(list_a)):
    # 添加边
    e = g.add_edge(v_a[set_a.index(list_a[i])], v_b[i])
    # 设置边属性
    ecolor[e] = "darkred"
    emarker[e] = "arrow"

# 添加边 b-c
for i in range(len(list_b)):
    for j in range(len(list_c[i])):
        e = g.add_edge(v_b[i], v_c[set_c.index(list_c[i][j])])
        ecolor[e] = "darkorange"
        emarker[e] = "none"


# 画图 https://graph-tool.skewed.de/static/doc/autosummary/graph_tool.draw.graph_draw.html
graph_draw(g, output="/home/dl/temp/fig.png",
           output_size=(int(1000*scale), int(1000*scale)),   # 画布大小
           pos=sfdp_layout(g, vweight=vweight, p=4),         # 布局算法 https://graph-tool.skewed.de/static/doc/autosummary/graph_tool.draw.sfdp_layout.html
           vertex_text=vname,
           vertex_color=vcolor,
           vertex_fill_color=vfcolor,
           vertex_font_weight=vfweight,
           vertex_font_size=vfsize,
           vertex_pen_width=1*scale,
           vertex_text_position=-2,     # 默认-1:顶点大小随文字缩放, -2:顶点大小不随文字缩放,由vertex_size控制
           vertex_size=vsize,
           edge_color=ecolor,
           edge_pen_width=1.2*scale,
           edge_marker_size=10*scale,
           edge_end_marker=emarker,
           )
           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1268739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LESS的叶绿素荧光模拟实现——任意波段荧光模拟

目录 前言一、任意波段荧光模拟的实现二、需要注意的输入参数 前言 此专栏默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有一定的了解。当然,您也可以在这里下载中…

NX二次开发UF_CURVE_create_joined_feature 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_joined_feature Defined in: uf_curve.h int UF_CURVE_create_joined_feature(UF_STRING_p_t uf_curve_string, int creation_method, tag_t * joined_curve_featur…

kafka C++实现生产者

文章目录 1 Kafka 生产者的逻辑2 Kafka 的C API2.1 RdKafka::Conf2.2 RdKafka::Message2.3 RdKafka::DeliveryReportCb2.4 RdKafka::Event2.5 RdKafka::EventCb2.6 RdKafka::PartitionerCb2.7 RdKafka::Topic2.8 RdKafka::Producer(核心) 3 Kafka 生产者…

报错解决:You may need an additional loader to handle the result of these loaders.

报错信息如下 vue 项目 Module parse failed: Unexpected token (1:9) File was processed with these loaders:* ./node_modules/vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js* ./node_modules/babel-loader/lib/index.js* ./node_modules/eslint-loader/in…

OpenCV | 图像梯度sobel算子、scharr算子、lapkacian算子

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline 1、sobel算子 img cv2.imread(pie.png,cv2.IMREAD_GRAYSCALE) cv2.imshow(img,img) cv2.waitKey() cv2.destroyAllWindows() pie图片 dst cv2.S…

4G5G防爆执法记录仪、防爆智能安全帽赋能智慧燃气,可视化巡检巡线,安全生产管控

随着燃气使用的普及,燃气安全问题日益突出。传统应急安全问题处理方式暴露出以下问题: 应急预案不完善:目前一些燃气企业的应急预案存在实用性不高、流程不清晰等问题,导致在紧急情况下难以迅速启动和有效执行。 部门协同不流畅…

Python将Labelme的Json标注文件进行增、删、改、查

Python将Labelme的Json标注文件进行增、删、改、查 前言前提条件相关介绍实验环境Json标注文件的增、删、改、查增代码实现输出结果 删代码实现输出结果 改代码实现输出结果 查代码实现输出结果 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精…

人机交互3——多主题多轮对话

1.主动切换 2.被动切换 3.多轮状态记忆

第二十章总结。。。

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Thread…

Sui主网升级至V1.14.2版本

Sui主网现已升级至V1.14.2版本,同时Sui协议升级至31版本。其他升级要点如下所示: #14875: [修复] 为所有权限设置共识度量值。 #14811: [Narwhal] 改进每个权限的共识信息度量的可用性。 完整变更日志:Release mainnet-v1.14.2 MystenL…

离散化笔记

文章目录 离散化的适用条件离散化的意思AcWing 802. 区间和CODECODE2 离散化的适用条件 离散化用于区间求和问题对于数域极大,而数的量很少的情况下 离散化的意思 背景:对于一个极大数域上的零星几个数进行操作后,求某段区间内的和 其实意思…

单片非晶磁性测量系统非晶特性

1. 非晶特性(与硅钢相比) 非晶带材的厚度很薄,一般为0.025 mm,只有取向硅钢带材的1/10左右。比总损耗很低,P1.5 / 50的典型值约为0.2 W/kg,该值是取向硅钢P1.7 / 50典型值的1/5左右。具有高磁致伸缩和低的…

(二)基于高尔夫优化算法GOA求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介: 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献: [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、高尔夫优化算法GOA简介 高尔夫优化算法…

第二十章 多线程总结

继承Thread 类 Thread 类时 java.lang 包中的一个类,从类中实例化的对象代表线程,程序员启动一个新线程需要建立 Thread 实例。 Thread 对象需要一个任务来执行,任务是指线程在启动时执行的工作,start() 方法启动线程&…

PTA_2023年软件设计综合实践_10(回溯法与分治限界法)

7-1 桥本分数 将1-9九个数不重复地赋给不同的9个元素 ,实现形如a/bcd/eff/hi 的形式。例:1/265/784/39 1/325/967/84 (注意:1/265/784/39 和5/781/264/39 只能算一种解),共有多少种不同的解。 语言选C #…

YOLOv5算法进阶改进(6)— 更换主干网络之ResNet18

前言:Hello大家好,我是小哥谈。ResNet18是ResNet系列中最简单的一个模型,由18个卷积层和全连接层组成,其中包含了多个残差块。该模型在ImageNet数据集上取得了很好的表现,成为了深度学习领域的经典模型之一。ResNet18的优点是可以解决深度神经网络中梯度消失的问题,使得性…

初识向量数据库

背景 现在的数据分为20%的传统结构化数据,80%的非结构化数据 结构化数据:主要单元是数值与符号,数据类型高度抽象且易于组织。基于数值运算与关系代数,可以轻松地对结构化数据进行分析。 非结构化数据:常见的类型包括…

荒野大镖客提示找不到emp.dll文件的5个修复方法-快速修复dll教程

今天我要和大家分享的是关于荒野大镖客缺失emp.dll的5个修复方法。我们都知道,荒野大镖客是一款非常受欢迎的游戏,但是有些玩家在玩游戏的过程中会遇到一些问题,比如emp.dll文件丢失。那么,emp.dll文件到底有什么作用呢&#xff1…

苹果Vision Pro即将量产

据界面新闻消息,苹果公司将在今年12月正式量产第一代MR(混合现实)产品Vision Pro。苹果公司对Vision Pro寄予了厚望,预计首批备货40万台左右,2024年的销量目标是100万台,第三年达到1000万台。 苹果的供应…