Ответ 1
Макет в графике определяется в матрице с двумя столбцами и строкой для каждого node. Первый столбец указывает его положение x, а второй - его y, а масштаб не имеет значения (он всегда масштабируется, чтобы соответствовать области от -1 до 1. Вы можете получить этот макет перед построением, просто вызвав функцию макета на графике
l <-layout.reingold.tilford(g)
l
[,1] [,2]
[1,] 0 0
[2,] -1 3
[3,] 0 1
[4,] 0 3
[5,] 0 2
[6,] 0 4
[7,] 1 3
Таким образом вы можете изменить его любым способом, который вы хотите вручную, а затем отправить его на график:
plot.igraph(g,
vertex.label = V(g)$name, vertex.label.color = "gray20",
vertex.size = ideg*25 + 40, vertex.size2 = 30,
vertex.color = "gray90", vertex.frame.color = "gray20",
vertex.shape = "rectangle",
edge.arrow.size=0.5, edge.color=col, edge.width = E(g)$weight / 10,
edge.curved = T,
layout = l)
Также кажется, что вы можете установить аргумент params
для управления компоновкой abit. Это список, содержащий аргумент root
, который, по-видимому, может быть использован для установки корня графа. Назначьте это число node (повторите, что igraph использует индексы типа C для узлов, первый - 0). Таким образом, установив корень в "C":
l <- layout.reingold.tilford(g,params=list(root=2))
EDIT: Также в RGraphViz
есть несколько хороших древовидных макетов, которые могут быть проверены.
ИЗМЕНИТЬ 2:
Это модифицированный фрагмент исходных кодов из моего пакета, который использует матрицу макета такого же типа для определения размещения узлов в графе, которые могут оказаться полезными:
gridLayout <- function(x)
{
LmatX <- seq(-1,1,length=ncol(x))
LmatY <- seq(1,-1,length=nrow(x))
loc <- t(sapply(1:max(x),function(y)which(x==y,arr.ind=T)))
layout <- cbind(LmatX[loc[,2]],LmatY[loc[,1]])
return(layout)
}
То, что эта функция делает, - это преобразовать матрицу, определяющую макет в сетке (аналогично layout()
) в двухколоночный макет с положениями x и y. Определите матрицу нулей и для каждого node целого числа от 1 до общего числа узлов (это идентификатор igraph + 1).
Например, для глупого графика 4 node:
grid <- matrix(c(
0,0,1,0,0,
2,0,3,0,4),nrow=2,byrow=TRUE)
library("igraph")
g <- graph.adjacency(matrix(1,4,4))
plot(g,layout=gridLayout(L))