使用 graph_tool 绘制网络关系图

目标

使用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,
           )
           

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

注解(概念、分类、自定义注解)

注解基本概念 注解(元数据)为我们在代码中添加信息提供一种形式化的方法,我们可以在某个时刻非常方便的使用这些数据。将的通俗一点,就是为这个方法增加的说明或功能。 作用: 编写文档:通过代码里标识的注解生成文档【生成doc文…

bugku题解记录2

文章目录 哥哥的秘密黄道十二官where is flag一段新闻 哥哥的秘密 给出了一个qq,那就去看看呗 hint里面说 收集空间信息——相册——收集微博信息——相册——解题——相册——提交flag 那看看空间先 盲文: hint:密码时地人 旗帜存在相册里…

聚焦 6G 无线技术——目标和需求

从 3G 到 5G 乃至之后的每一种无线标准,都在设计时加入了推动行业发展的具体目标。例如,4G 专注于以 IP 为中心的灵活语音、数据和视频通信,而 5G 则在此基础上进行了改进。6G 的目标是提供更加无处不在、更高效、更身临其境的无线连接。6G 系…

想要更快的文件传输?看看这些aspera的替代方案吧

随着数据量的增大,文件传输已经成为许多公司和组织日常工作中必不可少的环节之一。而对于大容量、海量数据的传输,普通的传输方式可能甚至无法胜任。Aspera作为一种高效的文件传输协议应运而生,其能够在处理大容量、高速传输方面表现出色。然…

Verilog 入门(一)(Verilog 简介)

文章目录 什么是 Verilog HDL?Verilog 主要能力模块时延数据流描述方式 什么是 Verilog HDL? Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和…

MATLAB | 官方举办的动图绘制大赛 | 第三周赛情回顾

MATHWORKS官方举办的迷你黑客大赛第三期(MATLAB Flipbook Mini Hack)的最新进展!! 很荣幸前三周都成为了阶段性获奖者~: https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13382 https://ww2.mathworks.cn/mat…

97.STL-查找算法 find

目录 STL-查找算法find 1.基本用法: 2.查找自定义类型: 3.查找范围: STL-查找算法find 在C的STL(标准模板库)中,find 算法用于在指定范围内查找指定值的元素。 功能描述: 查找指定元素&…

git-4

1.在GitHub上创建个人仓库 现在仓库中有LICENSE文件,但本地没有这个文件,该怎么办呢?往下看 2.把本地仓库同步到GitHub 3.不同人修改了不同文件如何处理? 两个人在同一个分支上,两个人修改了不同文件 其中一人&…

Django路由分发

首先明白一点,Django的每一个应用下都可以有自己的templates文件夹,urls.py文件夹,static文件夹,基于这个特点,Django能够很好的做到分组开发(每个人只写自己的app),作为老大&#x…

uniapp 打包的 IOS打开白屏 uniapp打包页面空白

uniapp的路由跟vue一样,有hash模式和history模式, 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。 如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。…

谱方法学习笔记-下(超详细)

谱方法学习笔记📒 谱方法学习笔记-上(超详细) 声明:鉴于CSDN使用 K a T e X KaTeX KaTeX 渲染公式, KaTeX \KaTeX KATE​X 与 L a T e X LaTeX LaTeX 不同,不支持直接的交叉引用命令,如\label和\eqref。 KaTeX \KaT…

【Web安全】拿到phpMyAdmin如何获取权限

文章目录 1、outfile写一句话2、general_log_file写一句话 通过弱口令拿到进到phpMyAdmin页面如何才能获取权限 1、outfile写一句话 尝试执行outfile语句写入一句话木马 select "<?php eval($_REQUEST[6868])?>" into outfile "C:\\phpStudy\\WWW\\p…

文本三剑客

目录 grep awk 工具介绍 awk 命令 awk 常见的内置变量可直接用 awk 命令使用举例 打印磁盘已经使用情况 打印字符串 打印字符串确定文件有多少行 提取 ip地址 打印 /etc/passwd 所有用户名 打印多列内容 提取 /etc/passwd 以 root 开头的行 打印倒数第二行 当前…

Spark将execl表格文件导入到mysql中

实现代码 excel所需的pom依赖 案例实现 实现代码 package excel_mysqlimport org.apache.spark.sql.SparkSession import java.util.Propertiesobject t1 {def main(args: Array[String]): Unit {val spark SparkSession.builder().appName("ExcelToMySQL") /…

网络运维与网络安全 学习笔记2023.11.29

网络运维与网络安全 学习笔记 第三十天 今日更新太晚啦&#xff01;&#xff01;&#xff01; 主要是今天工作时挨了一天骂&#xff0c;服了&#xff0c;下次记得骂的轻一点&#xff01;&#xff01;&#xff01; &#xff08;要不是为了那点微薄的薪资&#xff0c;谁愿意听你…

数据结构-二叉树(2)

3.4堆的应用 3.4.1 堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 1.升序&#xff1a;建大堆&#xff1b; 2.降序&#xff1a;建小堆。 2. 利用堆删除思想来进行排序 这种写法有两个缺点&#xff1a; 1、先有一个堆的数据结构 …

Bert-VITS2本地部署遇到的错误

关于Bert-VITS2本地部署遇到的错误 1、在下载python中相关依赖时报错 building ‘hdbscan._hdbscan_tree’ extension error: Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools”: https://visualstudio.microsoft.com/visual-cpp-bu…

[密码学]DES

先声明两个基本概念 代换&#xff08;substitution&#xff09;,用别的元素代替当前元素。des的s-box遵循这一设计。 abc-->def 置换&#xff08;permutation&#xff09;&#xff0c;只改变元素的排列顺序。des的p-box遵循这一设计。 abc-->bac DES最核心的算法就是…

【人工智能Ⅰ】实验2:遗传算法

实验2 遗传算法实验 一、实验目的 熟悉和掌握遗传算法的原理、流程和编码策略&#xff0c;理解求解TSP问题的流程并测试主要参数对结果的影响&#xff0c;掌握遗传算法的基本实现方法。 二、实验原理 旅行商问题&#xff0c;即TSP问题&#xff08;Traveling Salesman Proble…