跳到内容

graph_from_adjacency_matrix() 是一个灵活的函数,用于从邻接矩阵创建 igraph 图。

用法

graph_from_adjacency_matrix(
  adjmatrix,
  mode = c("directed", "undirected", "max", "min", "upper", "lower", "plus"),
  weighted = NULL,
  diag = TRUE,
  add.colnames = NULL,
  add.rownames = NA
)

from_adjacency(...)

参数

adjmatrix

一个方形邻接矩阵。从igraph版本0.5.1开始,这可以是一个使用 Matrix 包创建的稀疏矩阵。

mode

字符标量,指定igraph应如何解释提供的矩阵。另请参阅 weighted 参数,解释也取决于它。可能的值有:directedundirectedupperlowermaxminplus。请参阅下面的详细信息。

weighted

此参数指定是否从邻接矩阵创建加权图。如果它是 NULL,则创建一个未加权的图,并且邻接矩阵的元素给出顶点之间的边数。如果它是一个字符常量,那么对于每个非零矩阵条目,都将创建一个边,并且该条目的值将作为边属性添加,并由 weighted 参数命名。如果它是 TRUE,则创建一个加权图,并且边属性的名称将为 weight。另请参阅下面的详细信息。

diag

逻辑标量,是否在计算中包含矩阵的对角线。如果这是 FALSE,则首先将对角线置零。

add.colnames

字符标量,是否将列名添加为顶点属性。如果它是“NULL”(默认值),则如果存在,列名将作为顶点属性“name”添加。 如果“NA”,则不会添加它们。 如果是一个字符常量,则它给出了要添加的顶点属性的名称。

add.rownames

字符标量,是否将行名添加为顶点属性。 可能的值与前一个参数相同。 默认情况下,不添加行名。 如果“add.rownames”和“add.colnames”指定相同的顶点属性,则忽略前者。

...

传递给 graph_from_adjacency_matrix()

一个 igraph 图对象。

详细信息

顶点的顺序被保留,即对应于第一行的顶点将是图中的顶点 0,依此类推。

graph_from_adjacency_matrix() 在两种主要模式下运行,具体取决于 weighted 参数。

如果此参数为 NULL,则创建一个未加权图,并且邻接矩阵的一个元素给出要在两个对应顶点之间创建的边数。 详细信息取决于 mode 参数的值

“directed”

该图将是有向图,并且矩阵元素给出两个顶点之间的边数。

“undirected”

为了方便起见,这与 max 完全相同。 请注意,不会检查矩阵是否对称。

“max”

将创建一个无向图,并且 max(A(i,j), A(j,i)) 给出边数。

“upper”

将创建一个无向图,只有右上三角形(包括对角线)用于边数。

“lower”

将创建一个无向图,只有左下三角形(包括对角线)用于创建边。

“min”

将创建一个无向图,顶点 ij 之间有 min(A(i,j), A(j,i)) 条边。

“plus”

将创建一个无向图,顶点 ij 之间有 A(i,j)+A(j,i) 条边。

如果 weighted 参数不是 NULL,则矩阵的元素给出边的权重(如果它们不为零)。 详细信息取决于 mode 参数的值

“directed”

该图将是有向图,并且矩阵元素给出边权重。

“undirected”

首先我们检查矩阵是否对称。 如果不是,则会出错。 然后,只有上三角形用于创建加权无向图。

“max”

将创建一个无向图,并且 max(A(i,j), A(j,i)) 给出边权重。

“upper”

将创建一个无向图,只有右上三角形(包括对角线)被使用(用于边权重)。

“lower”

将创建一个无向图,只有左下三角形(包括对角线)用于创建边。

“min”

将创建一个无向图,min(A(i,j), A(j,i)) 给出边权重。

“plus”

将创建一个无向图,A(i,j)+A(j,i) 给出边权重。

参见

make_graph()graph_from_literal() 用于创建图的其他方式。

作者

Gabor Csardi csardi.gabor@gmail.com

示例


g1 <- sample(
  x = 0:1, size = 100, replace = TRUE,
  prob = c(0.9, 0.1)
) %>%
  matrix(ncol = 10) %>%
  graph_from_adjacency_matrix()

g2 <- sample(
  x = 0:5, size = 100, replace = TRUE,
  prob = c(0.9, 0.02, 0.02, 0.02, 0.02, 0.02)
) %>%
  matrix(ncol = 10) %>%
  graph_from_adjacency_matrix(weighted = TRUE)
E(g2)$weight
#>  [1] 4 3 2 2 2 4 2 5 2 2 2 2

## various modes for weighted graphs, with some tests
non_zero_sort <- function(x) sort(x[x != 0])
adj_matrix <- matrix(runif(100), 10)
adj_matrix[adj_matrix < 0.5] <- 0
g3 <- graph_from_adjacency_matrix(
  (adj_matrix + t(adj_matrix)) / 2,
  weighted = TRUE,
  mode = "undirected"
)

g4 <- graph_from_adjacency_matrix(
  adj_matrix,
  weighted = TRUE,
  mode = "max"
)
expected_g4_weights <- non_zero_sort(
  pmax(adj_matrix, t(adj_matrix))[upper.tri(adj_matrix, diag = TRUE)]
)
actual_g4_weights <- sort(E(g4)$weight)
all(expected_g4_weights == actual_g4_weights)
#> [1] TRUE

g5 <- graph_from_adjacency_matrix(
  adj_matrix,
  weighted = TRUE,
  mode = "min"
)
expected_g5_weights <- non_zero_sort(
  pmin(adj_matrix, t(adj_matrix))[upper.tri(adj_matrix, diag = TRUE)]
)
actual_g5_weights <- sort(E(g5)$weight)
all(expected_g5_weights == actual_g5_weights)
#> [1] TRUE

g6 <- graph_from_adjacency_matrix(
  adj_matrix,
  weighted = TRUE,
  mode = "upper"
)
expected_g6_weights <- non_zero_sort(adj_matrix[upper.tri(adj_matrix, diag = TRUE)])
actual_g6_weights <- sort(E(g6)$weight)
all(expected_g6_weights == actual_g6_weights)
#> [1] TRUE

g7 <- graph_from_adjacency_matrix(
  adj_matrix,
  weighted = TRUE,
  mode = "lower"
)
expected_g7_weights <- non_zero_sort(adj_matrix[lower.tri(adj_matrix, diag = TRUE)])
actual_g7_weights <- sort(E(g7)$weight)
all(expected_g7_weights == actual_g7_weights)
#> [1] TRUE

g8 <- graph_from_adjacency_matrix(
  adj_matrix,
  weighted = TRUE,
  mode = "plus"
)
halve_diag <- function(x) {
  diag(x) <- diag(x) / 2
  x
}
expected_g8_weights <- non_zero_sort(
  halve_diag(adj_matrix + t(adj_matrix))[lower.tri(adj_matrix, diag = TRUE)]
)
actual_g8_weights <- sort(E(g8)$weight)
all(expected_g8_weights == actual_g8_weights)
#> [1] TRUE

g9 <- graph_from_adjacency_matrix(
  adj_matrix,
  weighted = TRUE,
  mode = "plus",
  diag = FALSE
)
zero_diag <- function(x) {
  diag(x) <- 0
}
expected_g9_weights <- non_zero_sort((zero_diag(adj_matrix + t(adj_matrix)))[lower.tri(adj_matrix)])
actual_g9_weights <- sort(E(g9)$weight)
all(expected_g9_weights == actual_g9_weights)
#> [1] TRUE

## row/column names
rownames(adj_matrix) <- sample(letters, nrow(adj_matrix))
colnames(adj_matrix) <- seq(ncol(adj_matrix))
g10 <- graph_from_adjacency_matrix(
  adj_matrix,
  weighted = TRUE,
  add.rownames = "code"
)
summary(g10)
#> IGRAPH af08bd5 DNW- 10 51 -- 
#> + attr: name (v/c), code (v/c), weight (e/n)