Igraph入门指南 4

news2025/6/9 17:51:56

二、图的创建

图分有向图和无向图,所以图的创建有各自的实现方式。

1、手工创建图:

1-1 通过文本创建:graph_from_literal

通过每项提供两个顶点名(或ID号)作为一条边的格式,手动创建图,顶点间用减号表示无向边,此时减号的数量不限,一个减号或N个减号都代表两个顶点间存在一条无向边;用加号表示有向边箭头所在的位置。如果函数的参数为空,会创建一个空图。

函数参数中,用来表示顶点name的实参,不需要用引号引起来。

如果图中需要孤立点,只输入顶点名即可。

> graph_from_literal()
IGRAPH 1932ffc U--- 0 0 -- 
+ edges from 1932ffc:
> g <- graph_from_literal(
+   Alice - Bob - Cecil - Alice,
+   Daniel - Cecil - Eugene,
+   Cecil - Gordon
+ )
> g
IGRAPH 503ae37 UN-- 6 6 -- 
+ attr: name (v/c)
+ edges from 503ae37 (vertex names):
[1] Alice--Bob    Alice--Cecil  Bob  --Cecil  Cecil--Daniel Cecil--Eugene
[6] Cecil--Gordon

> graph_from_literal( A--B, C--D, E--F, G--H, I, J, K ) %>% print_all()
IGRAPH a5903c8 UN-- 11 4 -- 
+ attr: name (v/c)
+ edges from a5903c8 (vertex names):
[1] A--B C--D E--F G--H

:可以用来定义顶点的集合,用:连接的顶点属于同一个集合,彼此之间没有边连接,但集合中的每个顶点,与用加号或减号连接的另一个集合中的每一个顶点,都有边连接

> g <- graph_from_literal( A:B:C:D -- T:E:W )
> V(g)$color <- rep(c('red','green'),c(4,3))
> plot(g)

在这里插入图片描述

对igraph来说,顶点的name属性值是字符型就可以,所以,也可以将顶点name的值设置为符号,当然这在实践中意义不大:

在这里插入图片描述

1-2 搭积木式之加函数:+

如前所述,顶点和边是图的基本元素,并且边是基于顶点形成的关系描述,所以,一定手动创建图,必须先有顶点。

前面说的graph_from_literal函数,在一个函数内部完成了顶点和边的设置。搭积木的完善图则把顶点和边的创建或删除分离,各自定义了独立的函数,使用户可以“纯手工”打造图。

在已有的图上(只要类是“igraph”就可以,所以这个图可以是一个全空的图),对顶点和边都可以用+ | -函数,甚至可以直接将一个图加到另一个图上。

前面说过,要用集合的理念来思考图的操作:

  • 命名图+命名图:如果两者都是命名图,则执行并集union操作
g <- make_ring(10) %>% set_vertex_attr('name',value = letters[1:10])
g2 <- make_ring(5) %>% set_vertex_attr('name',value = letters[1:5])
plot(g+g2)

在这里插入图片描述

  • 无名图+无名图:如果两者都是无名图,则执行不相交并disjoint_union操作
g <- make_ring(10)
g2 <- make_ring(5)
disjoint_union(g,g2) %>% plot()

在这里插入图片描述

  • 命名图+无名图:如果一个图是命名图,另一个是无名图,结果还是不相交并,但无名图的顶点标签是空
g <- make_ring(10) %>% set_vertex_attr('name',value = letters[1:10])
g2 <- make_ring(5)
plot(g+g2)

在这里插入图片描述

  • 图+数字:在图中添加数字指定数量的顶点,只添加顶点,不添加边。如果图是无名图,plot的结果显示顶点ID,如果图是命名图,新添加的顶点没有标签。
> par(mfrow=c(1,2))
> g <- make_ring(10)
> plot(g+5)
> title('无名图')
> g <- make_ring(10) %>% set_vertex_attr('name',value = letters[1:10])
> plot(g+5)
> title('命名图')

在这里插入图片描述

  • 图+字符向量:将字符向量视为顶点的name,在图中添加相应数量的顶点,只添加顶点,不添加边。如果图是无名图,plot时新添加的顶点显示标签,原有的顶点标签显示为空;如果图是命名图,全部显示标签。

在这里插入图片描述

  • 图+vertice():向图添加参数中提供的顶点,并可以同时设置新添加顶点的属性,这也是本函数的主要用途。

注意:此时,vertice()中的参数默认是新添加顶点的name,即便输入的是数字,也被用作顶点的name,而不是id

g <- make_ring(10) %>% 
  set_vertex_attr('color',value = 'green')%>% 
  set_vertex_attr('name',value = letters[1:10])
plot(g+vertices(1:5,color='red'))

在这里插入图片描述

  • 图+edges(): 因为边必须依赖顶点而存在,所以新添加的边必须基于图中已有的顶点。如果想添加图中原有顶点之外的顶点的边,必须先添加顶点。
g <- make_ring(10) %>% 
  set_edge_attr('color',value='blue') %>% 
  set_edge_attr('weight',value=4)
(g+edges(sample(1:10,4),color='red',weight=20)) %>% plot()

在这里插入图片描述

如果图是无名图,只能用顶点ID设置边,如果是命名图,可以用name属性设置边,当然也可以用顶点ID设置边

  • 图+path():安装path()指定的路径添加边。当然,这些顶点必须已经存在于图中

在这里插入图片描述

1-3 通过函数添加顶点:add_vertices

与`+vertice()类似,在设置添加顶点数量的同时,可设置顶点属性,两者的区别是:

图 + vertice()中+是个函数,不需要管道运算符;

add_vertices本身是个函数,需要与管道运算符连用。

make_ring(10) %>% 
  set_vertex_attr('color',value='green') %>% 
  add_vertices(5,color='red') %>% 
  plot()

在这里插入图片描述

1-4 通过函数添加边:add_edges

一般与管道运算符连用,可以同时设置边的属性。注意,如果要一次添加多条边,需要用c()函数将这些边包裹起来。

make_empty_graph(10) %>% 
  set_edge_attr('color',value = 'blue') %>% 
  add_edges(c(
    1,3,
    2,4,
    6,9
  ),color='red') %>% 
  plot()

在这里插入图片描述

1-5 删除顶点:delete_vertices

可以通过顶点ID或name删除指定的顶点

如果原图是无名图,通过顶点ID删除顶点后,新图的顶点ID被重新分配

g <- make_ring(10) %>% 
  set_vertex_attr('color',value = 'green') %>% 
  set_vertex_attr(index=7:9,name='color',value = 'red')
plot(g)  
g %>% delete_vertices(7:9) %>% 
  plot()
title('删除后所有顶点ID被重新分配')

在这里插入图片描述

如果是命名图,新图仍然保留原顶点名

g <- make_(ring(10),
      with_vertex_(
        name=letters[1:10]
      ))
plot(g)  
g %>% delete_vertices(7:9) %>% 
  plot()

在这里插入图片描述

1-6 删除边: delete_edges
  • 用边ID指定要删除的边。注意,这里一个坑,前面习惯了用顶点了表述边,主观认为把函数中的参数设置为c(1,2,5,6),会删除顶点1和顶点2之间的边、以及顶点5和顶点6之间的边,一个删除两条边。其实不然,本函数的这个参数,如果直接输入数字的话,igraph把这些数字看作边的ID号,所以,这样设置会删除4条边,不是2条。
g <- make_ring(10)
plot(g)
g %>% delete_edges(
  c(1,2,5,6)
) %>% 
  plot()

在这里插入图片描述

  • 想用顶点来指定要删除的边,用"a|b""3|4"的格式。注意需要用引号引起来。
g <- make_ring(10)
plot(g)
g %>% delete_edges(
  c('1|2','5|6')
) %>% 
  plot()

在这里插入图片描述

  • 或者用get.edge.ids函数,也可以将参数中相邻的两个数字解释为顶点的ID,并返回正确的边ID,效果与前面一样。
> get.edge.ids(g,c(1,2,5,6))
[1] 1 5
g %>% delete_edges(
  get.edge.ids(g,c(1,2,5,6))
) %>% 
  plot()

在这里插入图片描述

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

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

相关文章

RocketMQ-存储与弹性伸缩

存储与弹性伸缩 一、介绍二、存储架构图1.CommitLog2.ConsumeQueue3.IndexFile 三、消息读写流程1.写入流程1.1 获取Topic元数据1.2 消息投递1.3 消息写入 2.读取流程2.1 获取Topic元数据2.2 消息拉取2.3 消息消费 四、消息持久化1.页缓存2.刷盘2.1 同步刷盘2.2 异步刷盘 五、集…

力扣199. 二叉树的右视图(DFS,BFS)

Problem: 199. 二叉树的右视图 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 无论是DFS还是BFS我们都要思考到达二叉树的每一层&#xff08;或者每一层中的每一个节点&#xff09;时&#xff0c;我们都该如何按题目要求做出对应得处理!!!在本体中我们主要是&#x…

为什么不用 index 做 key?

“在 Vue 中&#xff0c;我们在使用 v-for 渲染列表的时候&#xff0c;为什么要绑定一个 key&#xff1f;能不能用 index 做 key&#xff1f;” 在聊这个问题之前我们还得需要知道 Vue 是如何操作 DOM 结构的。 虚拟DOM 我们知道&#xff0c;Vue 不可以直接操作 DOM 结构&am…

使用docker部署redis集群

编写脚本 批量创建目录文件&#xff0c;编写配置文件 [rootlocalhost ~]# cat redis.sh #/bin/bash for port in $(seq 1 6); do mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >>/mydata/redis/node-…

吴恩达deeplearning.ai:倾斜数据集的误差指标精确率、召回率

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 倾斜数据集的误差指标罕见病预测精确率和召回率 精确率和召回率的权衡精确率和召回率的矛盾关系 F1算法 倾斜数据集的误差指标 在神经网络中&#xff0c;如果你的数据集中正例和负…

吉林大学 容斥原理 章节作业

作业题填空题解答题 作业题 填空题 聚会上&#xff0c;5位先生各自寄存自己的帽子。在返还时&#xff0c;有( )种方法使得至少有一位先生拿到的是自己原来的帽子。 【答案】76 计算多重集 S { 4 ⋅ a , 3 ⋅ b , 4 ⋅ c , 6 ⋅ d } S\{4 \cdot a, 3 \cdot b, 4 \cdot c, …

黑马点评-附近商户实现

GEO数据结构 Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;根据经纬度来检索数据。 GEO本质上是基于sortedSet实现的&#xff0c;在Sorted Set中&#xff0c;每个成员都是与一个分数(score)相关联的&#xff0c;这个分数用于对成员进行排序…

如何利用生成式人工智能助力短视频剧本创作?

短视频已成为现代人获取娱乐和信息的一种流行方式。不同于传统的电影和电视剧&#xff0c;短视频的时长通常较短&#xff0c;内容形式多样&#xff0c;更适合快节奏的社会生活。本文将讨论如何编写短视频剧本&#xff0c;以及它与传统故事在结构和内容上的区别。 简介 短视频剧…

测试工具使用技巧01-->jmeter链接mysql

前言 在做接口或者性能测试的时候&#xff0c;有时需要jmeter连接数据库做操作&#xff0c;可以看看如下实例。操作实例 在mysql数据库中有如下数据表 在jmeter导入jdbc驱动插件&#xff08;需要的留言找我拿&#xff09; 在jmeter测试计划元件最下面&#xff0c;导入jdbc.…

Unity的PICO项目基础环境搭建笔记(调试与构建应用篇)

文章目录 前言一、为设备开启开发者模式1、开启PICO VR一体机。前往设置>通用>关于本机>软件版本号2、一直点击 软件版本号 &#xff0c;直到出现 开发者 选项3、进入 开发者模式&#xff0c;打开 USB调试&#xff0c;选择 文件传输 二、实时预览应用场景1、下载PC端的…

使用 Python 读取 NetCDF 数据

栅格通用数据格式(NetCDF)通常用于存储多维地理数据。这些数据的一些示例包括温度、降水量和风速。NetCDF 中存储的变量通常每天在大片(大陆)区域进行多次测量。由于每天进行多次测量,数据值会快速积累并且变得难以处理。当每个值还分配给一个地理位置时,数据管理会更加复…

tcp流式服务和粘包问题

目录 1.概念 2.流式服务 3.粘包问题 1.概念 套接字是一个全双工的 使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输. TCP连接是全双工的,即双方的数据读写可以通过一个连接进行,完成…

什么是数据采集与监视控制系统(SCADA)?

SCADA数据采集是一种用于监控和控制工业过程的系统。它可以实时从现场设备获得数据并将其传输到中央计算机&#xff0c;以便进行监控和控制。SCADA数据采集系统通常使用传感器、仪表和控制器收集各种类型的数据&#xff0c;例如温度、压力、流量等&#xff0c;然后将这些数据汇…

git讲本地代码提交到码云https://gitee.com/

首先需要在码云中自己账号下创建一个空的仓库 第一步 如下图 第二步 仓库名字和仓库是否私有&#xff0c;其他不用选 以上操作好了以后 回到本地&#xff0c;在本地你要上传到仓库的项目路径下&#xff0c;初始化为git 执行 git init 接着&#xff0c;把远程仓库地址复制下…

外泌体相关基因肝癌临床模型预测——2-3分纯生信文章复现——03.差异表达基因筛选(2)

内容如下&#xff1a; 1.外泌体和肝癌TCGA数据下载 2.数据格式整理 3.差异表达基因筛选 4.预后相关外泌体基因确定 5.拷贝数变异及突变图谱 6.外泌体基因功能注释 7.LASSO回归筛选外泌体预后模型 8.预后模型验证 9.预后模型鲁棒性分析 10.独立预后因素分析及与临床的…

STL之deque容器代码详解

1 基础概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作。 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低。 deque相对而言&#xff0c;对头部的插入删除速度回比vector快。 vector访问…

猫头虎分享已解决Bug || 云服务中断:CloudOutage, CloudProviderError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

HashMap构造函数

HashMap() /*** Constructs an empty <tt>HashMap</tt> with the default initial capacity* (16) and the default load factor (0.75).* 这是一个默认的构造方法&#xff0c;初始化的容量大小是16&#xff0c;装填因子是0.75* a 装填因子* n 关键字个数* m 总容…

Linux随记(八)

一、crontab运行shell脚本&#xff0c;py脚本 &#xff08;注意事项&#xff09; 情景描述&#xff1a; 目前有个sh脚本他最初大致内容是。 cat t11.sh#!/bin/bash source /etc/profile /bin/python3 /tmp/1.py sh /tmp/1.sh echo -e "$(date %F)" >…

C语言指针、数组学习记录

指针 指针是什么 数据在内存中存放的方式 声明一个变量int i 3;&#xff0c;那么在内存中就会分配一个大小为4字节&#xff08;因为int类型占4字节&#xff09;的内存空间给变量i&#xff0c;这块内存空间存放的数据就是变量i的值。 换句话说就是&#xff0c;在内存中给变…