Search code examples
rigraphvegannetwork-analysis

Writing a graph and keeping the vertex names


I'm trying to create a graph and then write it with the function write.graph (package igraph). Hence, I create the distance matrix

require(vegan)
data(dune)
dis <- vegdist(dune)

and then I define explicitly the rownames:

x <- c("dune1")
for (i in 1: 20){
  n <- paste("dune", i, sep="")
  x <- append(x, n)

}
rownames(dune) <- x

With the following procedure I create an undirected graph through the minimum spanning tree algorithm.

gg  <- graph.adjacency(as.matrix(dis), weighted=TRUE)
gg_mst <- as.undirected(mst(gg))

At this point I want to represent it such to open it with pajek. In order to do that I use write.graph:

write.graph(gg_mst, "graph.net", format="pajek")

obtaining the following graph: enter image description here

The names are lost!

Nevertheless, if i use the same function using a different format:

write.graph(gg_mst, "graph.txt", format="ncol")

I obtain a file keeping the rownames:

dune1 dune3 0.448275862068966
dune2 dune3 0.341463414634146
dune2 dune10 0.294117647058824
dune3 dune4 0.270588235294118
...   ...   ...

Is it a bug related to the use of write.graph with the format "pajek"?


Solution

  • You need to assign id attributes of the vertices in order to be able to have the vertices' names shown in a pajek viewer such as this one http://vlado.fmf.uni-lj.si/pub%20/networks/pajek/default.htm or gephi. Need to modify a few lines of your code like the following:

    dis <- vegdist(dune)
    x <- c()
    for (i in 1: 20){
      n <- paste("dune", i, sep="")
      x <- append(x, n)  
    }
    gg  <- graph.adjacency(as.matrix(dis), weighted=TRUE)
    gg_mst <- as.undirected(mst(gg))
    V(gg_mst)$id <- x # assign the ids
    write.graph(gg_mst, "graph.net", format="pajek")
    

    Opening with pajek shows the vertex ids correctly.

    enter image description here