社会网络构建
本文使用igraph包构建社会网络,并介绍几种常见的构建方法
1 安装
# igraph包与社会网络
# install.packages("igraph")
# install.packages("tidyverse")
library("igraph")
library("tidyverse")
2 自定义
自定义方法使用graph.formula函数
# 网络图创建
# 1 自定义无向网络
g1 <- graph.formula("A"-"B","A"-"C","A"-"D","A"-"E","C"-"D")
print(g1) # 查看网络信息
plot(g1) # 可视化
查看节点(数)、连边(数)
V(g1) # 查看节点
vcount(g1) # 节点数量
E(g1) # 查看连边
ecount(g1) # 连边数量
构建无向网络
# 自定义有向网络
g2 <- graph.formula("A"-+"B","A"+-"C","A"+-"D","A"-+"E","C"+-+"D")
plot(g2)
节点名称修改
# 节点名修改
V(g2)$name <- c("张三","李四","王五","Bob","Mary")
plot(g2)
获取邻接矩阵
# 获取邻接表
matrix <- get.adjacency(g2,sparse = TRUE)
print(matrix)
3 数据框
使用数据框构建需要定义节点数据框和连边数据框,节点属性和连边属性可以定义各自数据框中,也可以在构建图对象后再添加各自属性。
# 连边、节点形式
V_number = 20 # 节点数量
E_number = 15 # 连边数量
name <- LETTERS[1:V_number] # 节点名称
attr1 <- rnorm(V_number,5,5) # 节点属性1
attr2 <- rnorm(V_number,10,5) # 节点属性2
# 节点及节点属性数据框
vertes <- data.frame(vertex = name,attr1 = attr1,attr2 = attr2)
# 连边及边属性数据框
edges <- data.frame(from = sample(name,E_number,replace = TRUE),
to = sample(name,E_number,replace = TRUE),
weight = runif(E_number,min = 0,max = 100))
# 将节点、连边转化为图对象
G <- graph_from_data_frame(d = edges, directed = TRUE,vertices=vertes)
plot(G)
在构建图对象后添加属性、节点颜色
# 在图对象中添加属性
V(G)$attr3 <- letters[1:V_number]
V(G)$attr3
# 节点颜色
V(G)$color <- "red"
plot(G)
4 矩阵
矩阵转化为图对象需要保证矩阵是方阵,如果是0-1矩阵则为无权重,如果其他元素则为加权。
# 邻接矩阵转化为图对象
# 0-1矩阵表示无权重
mygraph2 <- sample(c(0,1),25,replace = TRUE) %>%
matrix(nrow = 5,byrow = TRUE) %>%
graph_from_adjacency_matrix(mode = "directed")
plot(mygraph2)
文本矩阵也可以转化为图
# 文本矩阵转化图对象
matrix( letters[1:20], nc = 2, byrow = TRUE) %>%
graph_from_edgelist() %>%
plot()
5 快速创建
# 快速创建网络
graph_from_literal(A-B) %>%
plot()
graph_from_literal( A--B, C--D, E--F, G--H, I, J, K ) %>%
plot() # 无向
graph_from_literal( A -+ B -+ C ) %>%
plot() # 有向
graph_from_literal(A:B:C -- H:I:G ) %>%
plot() # 二部图
graph_from_literal( A +-+ B +---+ C ++ D + E) %>%
plot()
6 一些简单图
# 创建经典图
make_full_graph(8) %>%
plot() # 完全图
make_tree(n = 20,children = 2,mode = "undirected") %>%
plot() # 树 每个节点有两个子节点
make_star(10, mode = "undirected") %>%
plot() # 星图
make_ring(8, directed = TRUE, mutual = TRUE) %>%
plot() # 环图
7 图操作
# 图操作
plot(mygraph2)
induced.subgraph(mygraph2,1:3) %>% plot() #提取指定节点所在图
(mygraph2 - vertices(c(1,2))) %>% plot() # 删除指定节点后的图
(mygraph2 + vertices(c(7,8))) %>% plot() # 添加节点后的图
(mygraph2 - edges(c(1,2),c(1,3))) %>% plot() # 删除指定边后的图
# 图运算
graph1 <- make_star(20, mode = "out")
graph2 <- make_ring(20, directed = TRUE, mutual = TRUE)
graph.union(graph1,graph2) %>% plot() # 图并运算