图与网络分析—R实现(二)
网络在各种实际背景问题中以各种各样的形式存在。交通、电子和通讯网络遍及我们日常生活的各个方面,网络规划也广泛用于解决不同领域中的各种问题,如生产、分配、项目计划、厂址选择、资源管理和财务策划等等。 网络图为描述系统各组成部分之间的关系提供了非常有效的直观和概念上的帮助,广泛应用于科学、社会和经济活动的各个领域中。许多研究的对象往往可以用一个图表示,研究的目的归结为图的优化问题。
一、赋权图的R建模
赋权图是“图论”的一个基本概念,对网络问题的分析都是从赋权图开始的,特别是在经济与管理领域中有许多的应用。设图G=(V,E),对G中的每条边[vi,vj],相应的有一个数wij,称为边[vi,vj]上的权。G连同在它边上的权叫作赋权图。“权”是指与边有关的数量指标。根据实际问题的需要,可以赋于它不同的含意,例如表示距离、时间、流量等。
在R中,赋权图的构建有两种数据结构:
1.1 从加权邻接矩阵建构赋权图
library(igraph)
#加权邻接矩阵输入
A = matrix(c(0, 0, 11, 5, 0, 0,0, 0, 9, 13, 0, 0,11, 9, 0, 9, 7, 0,5, 13, 9, 0, 15, 5,0, 0, 7, 15, 0, 9,0, 0, 0, 5, 9, 0),
nrow= 6 , ncol= 6 ,byrow = TRUE)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 0 11 5 0 0
[2,] 0 0 9 13 0 0
[3,] 11 9 0 9 7 0
[4,] 5 13 9 0 15 5
[5,] 0 0 7 15 0 9
[6,] 0 0 0 5 9 0
#创建一个有向图(列节点为有向边的起点)
g <- graph.adjacency(A,weighted=TRUE, mode = c("directed"))
plot(g,edge.label=E(g)$weight)
plot(g,layout=layout.reingold.tilford,edge.label=E(g)$weight)
1.2 从边列表建构赋权图
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)
[,1] [,2] [,3]
[1,] 1 2 6
[2,] 1 3 5
[3,] 1 4 4
[4,] 1 6 4
[5,] 3 6 4
[6,] 3 7 3
[7,] 4 7 3
[8,] 5 8 5
[9,] 6 8 4
[10,] 7 8 6
#创建一个有向图
g <- make_graph(t(m[,1:2]),directed = FALSE)
#创建一个无向图
h <- make_graph(t(m[,1:2]),directed = TRUE)
graph_attr(g,'weight') <- m[,3]
plot(g,edge.label = graph_attr(g,'weight'))
1.3 从表格数据建构赋权图
m <- read.table(row.names=1, header=TRUE, text=
" A B C D E F
A 0.00000000 0.0000000 0.0000000 0.0000000 0.05119703 1.3431599
B 0.00000000 0.0000000 -0.6088082 0.4016954 0.00000000 0.6132168
C 0.00000000 -0.6088082 0.0000000 0.0000000 -0.63295415 0.0000000
D 0.00000000 0.4016954 0.0000000 0.0000000 -0.29831267 0.0000000
E 0.05119703 0.0000000 -0.6329541 -0.2983127 0.00000000 0.1562458
F 1.34315990 0.6132168 0.0000000 0.0000000 0.15624584 0.0000000")
m <- as.matrix(m)
ig <- graph.adjacency(m, mode="undirected", weighted=TRUE)
plot(ig,edge.label=get.data.frame(ig)$weight)
1.4 从数据文件建构赋权图
边列表数据文件mydata.csv
from | 5 | 5 | 5 | 1 | 1 | 1 | 1 | 4 | 4 | 4 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
to | 1 | 2 | 3 | 5 | 4 | 2 | 3 | 1 | 2 | 3 | 5 | 1 | 4 | 3 | 5 | 1 | 4 | 2 |
weight | 8 | 20 | 9 | 8 | 10 | 416 | 121 | 9 | 26 | 21 | 19 | 430 | 28 | 210 | 7 | 111 | 20 | 203 |
library(igraph)
data=read.csv("mydata.csv",header = T)
g=graph.adjacency(data[,1:2],mode="undirected",weighted=T) #创建图
plot(g,edge.label=data$weight)
二、邻接矩阵和边列表的转换
library(igraph)
#加权邻接矩阵输入
A = matrix(c(0, 0, 11, 5, 0, 0,0, 0, 9, 13, 0, 0,11, 9, 0, 9, 7, 0,5, 13, 9, 0, 15, 5,0, 0, 7, 15, 0, 9,0, 0, 0, 5, 9, 0),
nrow= 6 , ncol= 6 ,byrow = TRUE)
g <- graph.adjacency(A,weighted=TRUE, mode = c("undirected"))
as_data_frame(g, what="edges") #获得边列表
as_adjacency_matrix(g) #获得邻接矩阵
as_adjacency_matrix(g, attr="weight") #获得加权邻接矩阵