graph.adjacency {igraph}R Documentation

Create graphs from adjacency matrices

Description

graph.adjacency is a flexible function for creating igraph graphs from adjacency matrices.

Usage

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

Arguments

adjmatrix

A square adjacency matrix. From igraph version 0.5.1 this can be a sparse matrix created with the Matrix package.

mode

Character scalar, specifies how igraph should interpret the supplied matrix. See also the weighted argument, the interpretation depends on that too. Possible values are: directed, undirected, upper, lower, max, min, plus. See details below.

weighted

This argument specifies whether to create a weighted graph from an adjacency matrix. If it is NULL then an unweighted graph is created and the elements of the adjacency matrix gives the number of edges between the vertices. If it is a character constant then for every non-zero matrix entry an edge is created and the value of the entry is added as an edge attribute named by the weighted argument. If it is TRUE then a weighted graph is created and the name of the edge attribute will be weight. See also details below.

diag

Logical scalar, whether to include the diagonal of the matrix in the calculation. If this is FALSE then the diagonal is zerod out first.

add.colnames

Character scalar, whether to add the column names as vertex attributes. If it is ‘NULL’ (the default) then, if present, column names are added as vertex attribute ‘name’. If ‘NA’ then they will not be added. If a character constant, then it gives the name of the vertex attribute to add.

add.rownames

Character scalar, whether to add the row names as vertex attributes. Possible values the same as the previous argument. By default row names are not added. If ‘add.rownames’ and ‘add.colnames’ specify the same vertex attribute, then the former is ignored.

Details

graph.adjacency creates a graph from an adjacency matrix.

The order of the vertices are preserved, i.e. the vertex corresponding to the first row will be vertex 0 in the graph, etc.

graph.adjacency operates in two main modes, depending on the weighted argument.

If this argument is NULL then an unweighted graph is created and an element of the adjacency matrix gives the number of edges to create between the two corresponding vertices. The details depend on the value of the mode argument:

directed

The graph will be directed and a matrix element gives the number of edges between two vertices.

undirected

This is exactly the same as max, for convenience. Note that it is not checked whether the matrix is symmetric.

max

An undirected graph will be created and max(A(i,j), A(j,i)) gives the number of edges.

upper

An undirected graph will be created, only the upper right triangle (including the diagonal) is used for the number of edges.

lower

An undirected graph will be created, only the lower left triangle (including the diagonal) is used for creating the edges.

min

undirected graph will be created with min(A(i,j), A(j,i)) edges between vertex i and j.

plus

undirected graph will be created with A(i,j)+A(j,i) edges between vertex i and j.

If the weighted argument is not NULL then the elements of the matrix give the weights of the edges (if they are not zero). The details depend on the value of the mode argument:

directed

The graph will be directed and a matrix element gives the edge weights.

undirected

First we check that the matrix is symmetric. It is an error if not. Then only the upper triangle is used to create a weighted undirected graph.

max

An undirected graph will be created and max(A(i,j), A(j,i)) gives the edge weights.

upper

An undirected graph will be created, only the upper right triangle (including the diagonal) is used (for the edge weights).

lower

An undirected graph will be created, only the lower left triangle (including the diagonal) is used for creating the edges.

min

An undirected graph will be created, min(A(i,j), A(j,i)) gives the edge weights.

plus

An undirected graph will be created, A(i,j)+A(j,i) gives the edge weights.

Value

An igraph graph object.

Author(s)

Gabor Csardi csardi.gabor@gmail.com

See Also

graph and graph.formula for other ways to create graphs.

Examples

adjm <- matrix(sample(0:1, 100, replace=TRUE, prob=c(0.9,0.1)), nc=10)
g1 <- graph.adjacency( adjm )
adjm <- matrix(sample(0:5, 100, replace=TRUE,
                      prob=c(0.9,0.02,0.02,0.02,0.02,0.02)), nc=10)
g2 <- graph.adjacency(adjm, weighted=TRUE)
E(g2)$weight

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

g4 <- graph.adjacency(adjm, weighted=TRUE, mode="max")
all(nzs(pmax(adjm, t(adjm))[upper.tri(adjm)]) == sort(E(g4)$weight))

g5 <- graph.adjacency(adjm, weighted=TRUE, mode="min")
all(nzs(pmin(adjm, t(adjm))[upper.tri(adjm)]) == sort(E(g5)$weight))

g6 <- graph.adjacency(adjm, weighted=TRUE, mode="upper")
all(nzs(adjm[upper.tri(adjm)]) == sort(E(g6)$weight))

g7 <- graph.adjacency(adjm, weighted=TRUE, mode="lower")
all(nzs(adjm[lower.tri(adjm)]) == sort(E(g7)$weight))

g8 <- graph.adjacency(adjm, weighted=TRUE, mode="plus")
d2 <- function(x) { diag(x) <- diag(x)/2; x }
all(nzs((d2(adjm+t(adjm)))[lower.tri(adjm)]) == sort(E(g8)$weight))

g9 <- graph.adjacency(adjm, weighted=TRUE, mode="plus", diag=FALSE)
d0 <- function(x) { diag(x) <- 0 }
all(nzs((d0(adjm+t(adjm)))[lower.tri(adjm)]) == sort(E(g9)$weight))

## row/column names
rownames(adjm) <- sample(letters, nrow(adjm))
colnames(adjm) <- seq(ncol(adjm))
g10 <- graph.adjacency(adjm, weighted=TRUE, add.rownames="code")
summary(g10)

[Package igraph version 0.6.5-1 Index]