Расположение в igraph определяется в виде матрицы с 2 столбцами и строкой для каждого узла.В первом столбце указывается его позиция 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
, который, очевидно, можно использовать для установки корня графа. Присвойте ему номер узла (помните, что igraph сначала использует C-подобные индексы для узлов, сначалаодин равен 0). Поэтому установка корня в «C»:
l <- layout.reingold.tilford(g,params=list(root=2))
РЕДАКТИРОВАТЬ: Кроме того, 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.Определите матрицу нулей и для каждого узла целое число от 1 до общего числа узлов (это идентификатор igraph + 1).
Например, для глупого графа из 4 узлов:
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))