Igraph入门指南 5

2、graph_from系列,将其他R数据结构转换成图

2-1 邻接矩阵转图:graph_from_adjacency_matrix

可以接受Matrix包创建的稀疏矩阵作为参数

邻接矩阵中行的顺序被保留,并作为图中顶点的顺序。

本函数几个重要的参数:

  • weighted:如果值是NULL,图是无权图,矩阵中的数字定义的是对应顶点间边的数量。
> par(mfrow=c(1,2))
> adjm <- matrix(sample(0:3, 16, replace = TRUE, 
+                       prob = c(0.6, 0.1,0.2,0.1)), ncol = 4)> g1 <- graph_from_adjacency_matrix(adjm)
> plot(g1)
> title('weighted = FALSE')> g2 <- graph_from_adjacency_matrix(adjm,weighted = TRUE)
> plot(g2)
> title('weighted = TRUE')

在这里插入图片描述

  • mode:

    • “directed”:创建有向图,矩阵中元素的值对应图中顶点间边的数量(weighted argument is NUL)或边的权重(Lweighted argument is not NULL);

    • “undirected”:同"max";

    • “max”:创建无向图,且max(A(i,j), A(j,i))对应图中顶点间边的数量(weighted argument is NUL)或边的权重(Lweighted argument is not NULL);

    • “upper”:根据矩阵的上三角部分(含对角线)创建无向图,矩阵中元素值对应图中顶点间边的数量(weighted argument is NUL)或边的权重(Lweighted argument is not NULL);

    • “lower”:根据矩阵的下三角部分(含对角线)创建无向图;

    • “min”:创建无向图,且min(A(i,j), A(j,i))对应图中顶点间边的数量(weighted argument is NUL)或边的权重(Lweighted argument is not NULL);

    • “plus”:创建无向图,且(A(i,j)+A(j,i))的结果设置图中顶点间边的数量(weighted argument is NUL)或边的权重(Lweighted argument is not NULL);

2-2 邻接列表转图:graph_from_adj_list

如果您打算对图形进行许多(小)修改,则邻接列表非常方便。在这种情况下,邻接列表比igraph图更有效。其做法是通过as_adj_list()将图转换为邻接列表,对图进行修改,最后通过调用graph_from_adj_list[)]再次创建一个igraph图

注意,对图调用as_adj_list()时,只保留图的结构及顶点的name属性,其他的顶点属性及所有的边属性会被丢弃,所以,对结果调用graph_from_adj_list,会发现无法完全还原,但两个图是同构的,仅此而已。

> par(mfrow=c(1,2))
> g <- make_ring(10,directed = TRUE) %>% 
+   set_vertex_attr('label',value = letters[1:10]) %>% 
+   set_edge_attr('color',value = rep('red',gorder(g)))
> plot(g)
> title('原图')
> (j <- as_adj_list(g,mode = 'out'))> g2 <- graph_from_adj_list(j)
> graph.isomorphic(g,g2)
[1] TRUE
> plot(g2)
> title('重新导入的图')

在这里插入图片描述

如何通过修改邻接列表了修改图,原帮助文档里没有示例,我实验一下,首先要避免一个坑。

虽然邻接列表是一种列表,但里面的元素属于igraph的顶点对象类型。所以,想要手动修改的邻接列表能还原为图,必须确保其中元素的类型是顶点。确保元素类型是顶点的办法可以用V(g)函数或vertex()函数。

> g <- make_ring(10,directed = TRUE)
> j <- as_adj_list(g)
> class(j)
[1] "list"
> class(j[[1]])
[1] "igraph.vs"

手动修改邻接列表主要分两种情况:

  • 不修改顶点,只修改边,这是最简单的情形,只需提供正确的顶点序列即可

注意,下面示例中,vertices(c(5,1,10))[[1]]的用法,并且j[[3]]用的是双方括号。

> par(mfrow=c(1,2))
> g <- make_ring(10,directed = TRUE) %>% 
+   set_vertex_attr('color',value =  rep('red',gorder(g)))
> plot(g)
> title('原图')
> (j <- as_adj_list(g,mode = 'out'))
> j[[3]]
+ 1/10 vertex, from 68d93f6:
[1] 4
# 修改顶点3的邻居,注意我先写了个错误的语法
> j[[3]] <- vertices(c(5,1,10))
> g2 <- graph_from_adj_list(j)
Error in FUN(X[[i]], ...) : 'list' object cannot be coerced to type 'double'
# 正确的语法
> j[[3]] <- vertices(c(5,1,10))[[1]]
> g2 <- graph_from_adj_list(j)
> plot(g2)
> title('重新导入的图')

在这里插入图片描述

  • 若要向原图增加新的顶点,可以用多种办法,如果想只要邻接列表实现,稍微有点繁琐(同样需要通过vertices() 函数),但完全可以实现。
> j[[3]] <- vertices(c(5,1,10))[[1]]
> g2 <- graph_from_adj_list(j)
> plot(g2)
> title('重新导入的图')
> j[[12]] <- vertices(sample(1:10,3))[[1]]
> g2 <- graph_from_adj_list(j)
> plot(g)
> title('原图')
> plot(g2)
> title('重新导入的图')

在这里插入图片描述

附:邻接列表的数据格式:

> j 
[[1]]
+ 1/10 vertex, from 68d93f6:
[1] 2[[2]]
+ 1/10 vertex, from 68d93f6:
[1] 3[[3]]
[1]  5  1 10
2-3 边列表转图:graph_from_edgelist

这是将电子表格数据转换为图的主要函数,

先看一下边列表的数据格式:

# 无名图[,1] [,2][1,]    1    2[2,]    2    3[3,]    3    4[4,]    4    5[5,]    5    6# 命名图[,1] [,2][1,] "a"  "b" [2,] "b"  "c" [3,] "c"  "d" [4,] "d"  "e" 

因为边列表就是普通的矩阵,里面的元素或者是正整数,或者是字符,不像邻接列表那样必须是顶点类型,所以,可以向操作普通矩阵那样修改。

比如增加新的顶点,以及这些顶点间的边:

j <- rbind(j,matrix(c('mm','mt','nn','ns'),ncol = 2))
graph_from_edgelist(j) %>% plot()

在这里插入图片描述

如需删除顶点,直接用矩阵语法操作

> plot(g)
> title('原图')
> graph_from_edgelist(j[-(7:9),]) %>% plot()
> title('重新导入的图')

在这里插入图片描述

官方帮助文档中还有几个graph_from函数,但我平时用不上,所以直接省略。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EPSON X1E000341003100 FA-238A石英晶体谐振器

EPSON X1E000341003100 FA-238A是一款无源晶振&#xff0c;具有特定的频率和尺寸规格。这款晶振的频率为20MHz&#xff0c;尺寸为3.20 x 2.50mm &#xff0c;这使得它非常适合用于小型化设计中。它的温度范围从-40℃到125℃&#xff0c;并且具有20ppm的频率稳定性&#xff0c;这…

软考高级:软件工程单元测试(驱动模块、被测模块、桩模块)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

FX110网:1月美国零售货币资金环比上升2.61%,嘉盛环比上升1.86%

美国商品期货交易委员会&#xff08;CFTC&#xff09;发布的最新月度报告显示&#xff0c;2024年1月零售货币存款与上月相比上升2.61%。 这份报告涵盖在美国运营的注册零售货币对交易商&#xff08;RFED&#xff09;和经纪自营商。包括嘉信理财&#xff08;CHARLES SCHWAB Futu…

重学SpringBoot3-集成FreeMarker

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成FreeMarker 1. 添加 FreeMarker 依赖2. 配置 FreeMarker 属性&#xff08;可选&#xff09;3. 创建 FreeMarker 模板4. 编写控制器5. 运行应用程序F…

【Java/Image】给指定路径下图片反色并加上当前日期形式的水印

【需求】 从通达信软件截屏下来的K线图&#xff0c;在打印前需要反色&#xff0c;打印后需要手动加上当前日期&#xff0c;这些都可以由程序代替手工完成。 以下是期待的效果。 【关键点】 给图片反色用的是梯度法&#xff0c;这个在网络上已有成型代码&#xff1b; 给图片…

【考研学子必看 ★2024考研国家线及调剂策略(3)】

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…

C++结合opencv—图像2维直方图初次尝试

// 二维直方图 void QuickDemo::two_histogram_demo(Mat &image) {Mat hsv, hs_hist;cvtColor(image, hsv, COLOR_BGR2HSV);int hbins 30, sbins 32;int hisat_bins[] { hbins,sbins };float h_range[] { 0,180 }; //180/306float s_range[] { 0,256 };// 256/328cons…

javaweb篇请求与相应的参数问题

目录 前言 简单传参设置 get请求无法识别 post请求 简单传参问题无法识别的解决问题 注意事项 改法 实体参数 代码展示 今日分享 前言 友友们&#xff0c;大家好&#xff0c;今天来开荒了,今天介绍的是在进行数据请求以及相应的时候&#xff0c;我们不仅仅只是进入一…

LED基础知识分享(三)

大家好&#xff0c;我是砖一。 一&#xff0c;LED的光衰与使用环境温度 什么叫LED光衰 光衰是指LED经过一段时间的点亮后,其光强会比原来的光强要低,而低了的部分就是LED的光衰。 一般LED封装厂家做测试是在实验室的条件下(25℃的常温下),以20MA的直流电连续点亮LED1000小时…

学习SSM的记录(六)-- Spring MVC

目录 Spring MVC 简介和体验 Spring MVC原理简单解析 Spring MVC涉及的组件 Spring MVC 快速体验 Spring MVC 接收数据 访问路径设置 接收参数&#xff08;重点&#xff09; param和json参数比较 param参数接收 路径参数接收 json参数接收 EnableWebMvc注解 接收C…

KEIL5新建第一个文件教程

1.进入keil5主页面点击project创建新工程。 2.先确定存放工程的地址然后创建双重文件目录&#xff0c;以便存放更多的文件代码实例。 3.寻找存放工程文件的位置&#xff0c;输入新工程文件名。 4.寻找对应项目的芯片。 4.这里选择。 5.创建新的文本点击保存。 6.添加刚刚创建的…

k8s关于pod

目录 1、POD 的创建流程 kubectl 发起创建 Pod 请求&#xff1a; API Server 接收请求并处理&#xff1a; 写入 Etcd 数据库&#xff1a; Kubelet 监听并创建 Pod&#xff1a; Pod 状态更新和汇报&#xff1a; 2、POD 的状态解析 1. Pending Pod 2. Running Pod 3. S…