图与网络分析—R实现(一)
图与网络
一个网络G,也可以称为图(graph)或网络图,是一种包含了节点V(即网络参与者,也称顶点)与边E(即节点之间的连接关系)的数学结构,记作G={V,E}。可以使用一个矩阵来存放节点之间的连接关系,这个矩阵称为邻接矩阵。如果网络中两个节点之间的边是有方向的,即从节点u出发指向节点v,这就是一个有向网络(有向图),否则称为无向网络(无向图)。网络的边也可以赋予权重,称为加权网络。
一、R的igraph包
igraph包是一个用来解决图与网络问题以及对其进行可视化的包。igraph是一个“历史悠久”的开源项目,提供了一组简单易用且功能强大的网络分析工具,igraph有多种语言接口,包括了R\Python\C++等等。尽管(无论在R还是Python中)已经有了更多的网络分析和可视化工具,igraph依然是最好的出发点。
igraph包中创建图的对象的函数是
make_graph(edges, ..., n = max(edges), isolates = NULL,directed = TRUE,dir = directed, simplify = TRUE)
1.其中edges参数为边组成的向量,这个向量中的元素既可以是数字也可以是字符,也可以是literals参数(但不经常用)。比如如果是数字,c(1,2)表示一条从点1到点2的边,c(1,2,2,3)表示两条边,一条从1到2,另一条从2到3,注意图中的点的编号不能用0来命名,否则会报错,至于原因就不太清楚啦;字母的原理与数字相同
2.n为最大边数,只在edges参数中的元素是数字的时候有用,但我还是不太清楚这个参数的实质作用是什么,好像一般情况下用不到。
3.isolates为孤立的点组成的向量,但只有在edges参数中的元素是字符时才有用,比如make_graph(c('a','b','b','c'),isolates = c('d','e'))这个图有两条边ab,bc,还有两个孤立的点d和e.
4.directed为一个布尔型参数,TRUE表示有向图,FALSE表示无向图,dir参数与directed参数是一样的,但两者不能同时出现。
5.simplify参数只有在edges参数使用literals时才有用。
make_graph(edges, ..., n = max(edges), isolates = NULL,directed = TRUE,dir = directed, simplify = TRUE)
1其中edges参数为边组成的向量,这个向量中的元素既可以是数字也可以是字符,也可以是literals参数(但不经常用)。比如如果是数字,c(1,2)表示一条从点1到点2的边,c(1,2,2,3)表示两条边,一条从1到2,另一条从2到3,注意图中的点的编号不能用0来命名,否则会报错,至于原因就不太清楚啦;字母的原理与数字相同
2.n为最大边数,只在edges参数中的元素是数字的时候有用,但我还是不太清楚这个参数的实质作用是什么,好像一般情况下用不到。
3.isolates为孤立的点组成的向量,但只有在edges参数中的元素是字符时才有用,比如make_graph(c('a','b','b','c'),isolates = c('d','e'))这个图有两条边ab,bc,还有两个孤立的点d和e.
4.directed为一个布尔型参数,TRUE表示有向图,FALSE表示无向图,dir参数与directed参数是一样的,但两者不能同时出现。
5.simplify参数只有在edges参数使用literals时才有用。
二、图的数据结构
图是一组顶点:通常用V(Vertex)表示顶点集合;一组边:通常用E (Edge) 表示边的集合,边是顶点对:如(v, k) ∈E ,其中v, k ∈ V;有向图的边表示从v指向k的边(单行线),无向图的边是无向边(v, k)(双向线);边的权:通常用W(Weight)表示权的集合,这三个集合构成的三元有序组就表示一个赋权图。简单图一般不考虑多重边和自回路,如下图所示。
library("igraph")
m <- matrix( c(1,2,6, 1,3,5, 1,4,4, 1,6,4, 3,6,4, 3,7,3, 4,7,3, 5,8,5, 6,8,4, 7,8,6) ,ncol = 3,byrow = T)
#创建一个无向图
g <- make_graph(t(m[,1:2]),directed = FALSE)
#创建一个有向图
h <- make_graph(t(m[,1:2]),directed = TRUE)
graph_attr(g,'weight') <- m[,3] #加载权重
graph_attr(h,'weight') <- m[,3] #加载权重
E(g)$weight=m[,3]
E(h)$weight=m[,3]
#也可以用第一个函数获得图的权
graph_attr(g,'weight') #得到g的权
plot(g,edge.label = graph_attr(g,'weight')) #图1
plot(h,edge.label = graph_attr(h,'weight')) #图2
连通:如果从V到K存在一条(无向)路径,则称V和K是连通的。连通图(Connected Graph):如果对于图的任一两个顶点v、K∈V,v和K都是连通的,则称该图为连通图。连通是图最重要的性质,表面我们所研究的对象图是一个有机整体。
1. 图的邻接矩阵
邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵 (两顶点若连接,则为1,反之为0)。设G=(V,E)是一个图,其中V={v1,v2,…,vn} 。G的邻接矩阵是一个的n阶方阵:
①对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。
②无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称。
无向网络的邻接矩阵(对称阵)
若节点i 和节点j之间存在连接,则令矩阵中第i行第j列上的元素yij=1;若节点i 和节点j之间不存在连接,则令矩阵元素yij=0。
有向矩阵的邻接矩阵(非对称阵)
若节点i和节点j之间存在有向连接,则令矩阵元素yij=1;若节点i和节点j之间不存在有向连接,则令矩阵元素yij=0。
图1的邻接矩阵为
get.adjacency(g)
[1,] . 1 1 1 . . . .
[2,] 1 . . . . 1 . .
[3,] 1 . . . . 1 1 .
[4,] 1 . . . . . 1 .
[5,] . . . . . . . 1
[6,] . 1 1 . . . . 1
[7,] . . 1 1 . . . 1
[8,] . . . . 1 1 1 .
图2的邻接矩阵为(!!!有向边默认以行为起点)
get.adjacency(h)
[1,] . 1 1 1 . . . .
[2,] . . . . . 1 . .
[3,] . . . . . 1 1 .
[4,] . . . . . . 1 .
[5,] . . . . . . . 1
[6,] . . . . . . . 1
[7,] . . . . . . . 1
[8,] . . . . . . . .
2. 图的加权邻接矩阵
若节点i 和节点j之间存在连接,则令矩阵中第i行第j列上的元素yij=权重;若节点i 和节点j之间不存在连接,则令矩阵元素yij=0。可见,网络的邻接矩阵是加权网络的特例,是权重值只有1和0两个取值的加权邻接矩阵。
图1的加权邻接矩阵
get.adjacency(g,attr = "weight",sparse = T)
[1,] . 6 5 4 . . . .
[2,] 6 . . . . 4 . .
[3,] 5 . . . . 4 3 .
[4,] 4 . . . . . 3 .
[5,] . . . . . . . 5
[6,] . 4 4 . . . . 4
[7,] . . 3 3 . . . 6
[8,] . . . . 5 4 6 .
3. 图的边列表
边列表,也称边表,图的储存结构之一。边表由表头结点和表结点两部分组成,图中每个顶点均对应一个存储在数组中的表头结点。边表是图的一种存储结构,用来描述图上的每一个点。对图的每个边进行编号,对图的每个顶点建立一个链表(n个顶点建立n个链表),第i个容器中的结点包含以顶点Vi为起点的所有边的编号。
图1的边列表
get.data.frame(g)
from to
1 1 2
2 1 3
3 1 4
4 2 6
5 3 6
6 3 7
7 4 7
8 5 8
9 6 8
10 7 8
参考文献
图与网络分析—R实现(一)的更多相关文章
- Linux/Centos下使用mtr做路由图进行网络分析
工具作用: mtr可以做路由图供我们分析哪里出现故障或者是否存在有网络拥塞的情况 1. 首先安装mtr 工具 使用yum 安装 : yum install mtr -y 2. 使用 我经常在工 ...
- 社交网络分析的 R 基础:(一)初探 R 语言
写在前面 3 年的硕士生涯一转眼就过去了,和社交网络也打了很长时间交道.最近突然想给自己挖个坑,想给这 3 年写个总结,画上一个句号.回想当时学习 R 语言时也是非常戏剧性的,开始科研生活时到处发邮件 ...
- 用R包中heatmap画热图
一:导入R包及需要画热图的数据 library(pheatmap) data<- read.table("F:/R练习/R测试数据/heatmapdata.txt",head ...
- 使用R画地图数据
用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. ...
- R(四): R开发实例-map分布图
前几章对R语言的运行原理.基本语法.数据类型.环境部署等基础知识作了简单介绍,本节将结合具体案例进行验证测试. 案例场景:从互联网下载全国三甲医院数据,以地图作为背景,展现各医院在地图上的分布图.全国 ...
- R实战读书笔记四
第三章 图形入门 本章概要 1 创建和保存图形 2 定义符号.线.颜色和坐标轴 3 文本标注 4 掌控图形维数 5 多幅图合在一起 本章所介绍内容概括例如以下. 一图胜千字,人们从视觉层更易获取和理解 ...
- 《R实战》读书笔记三
第二章 创建数据集 本章概要 1探索R数据结构 2使用数据编辑器 3数据导入 4数据集标注 本章所介绍内容概括例如以下. 两个方面的内容. 方面一:R数据结构 方面二:进入数据或者导入数据到数据结构 ...
- achartengine之折线图
问题在文章的最后,大致说来就是折线图,如果点的个数大于3个的时候,不是所有的点都显示对应的值的,这是为什么呢,本来以为是小问题,但两天了还没找到原因) 将前两天的折线图代码做了小量修改,形成一个类似于 ...
- android使用achartengine 实现折线图
折线图的实现分为下边几个步骤: 1.第一步:数据的准备 XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset(); XYSeri ...
- R语言中文社区历史文章整理(类型篇)
R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...
随机推荐
- Arthas 查询服务器内存数据
1.打开Arthas所在位置 eg:/home 2.java -jar arthas-boot.jar 运行jar包 3.选择要执行的java jar包 eg : 1 4.执行查看命令vmtool - ...
- SourceMap解析
前端发展至今已不再是刀耕火种的年代了,出现了typescript.babel.uglify.js等功能强大的工具.我们手动撰写的代码一般具有可读性,并且可以享受高级语法.类型检查带来的便利,但经过工具 ...
- Topsis法的python实现
TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution )法是C.L.Hwang和K.Yoon于1981年首 ...
- uniapp中使用AntV F6 + table表格插件使用
首先看页面效果: AntV官网下载F6文件到项目中与uViewUI插件 <template> <view class="page"> <!-- 导航栏 ...
- 升级openssl版本
一.安装步骤 1.下载openssl安装包 2.编译安装 3.备份旧版本openssl 4.添加软连接 5.添加OpenSSL动态链接库并使其生效 二.下载openssl安装包 [root@local ...
- ESP32(WeMos D1 R32)开发资料
1.乐鑫官网 2.ESP32踩坑 ESP32控制摇杆,定义sw的引脚时一定要设置为上拉才行. 3.ESP32入门之arduino IDE环境搭建 4.ESP32 MicroPython编程官网文档 E ...
- jsp第6个作业—jdbc
UsersDao.java package a; import java.sql.Connection; import java.sql.PreparedStatement; import java. ...
- Oracle账户被锁住,解锁
转载自:https://blog.csdn.net/weixin_43464743/article/details/121226334 方法一PLSQL解锁1.用dba用户登录plsql.2.左侧选择 ...
- "蔚来杯"2022牛客暑期多校训练营1 C.Grab the Seat!
C.Grab the Seat! 题目链接 https://ac.nowcoder.com/acm/contest/33186/C 题目大意 1.二维平面中,(0,1) - (0,m)为屏幕 2.有n ...
- maven插件实现项目一键“run maven、debug maven”等命令 => 插件名:“maven helper”
1.在IDEA中下载插件 2.使用 总结:通过 "maven helper" 插件即可通过命令实现对项目的一键管理