Подтвердить что ты не робот

Как контролировать компоновку графика играм с фиксированными позициями?

Я пытаюсь сделать сетевую визуализацию похожей на блок-схему. Я довольно близок к следующему коду, но у меня есть пара вопросов:

  • Это лучший алгоритм layout(), или я могу вручную назначить позицию для каждого node >
  • Как я могу убедиться, что эти узлы не перекрываются в сюжете (как они здесь)?
  • Можно ли назначить один node как "якорь" или отправную точку? то есть я могу сделать "C" самым верхним или самым левым node?

Спасибо большое!

library("igraph")
L3 <- LETTERS[1:8]
d <- data.frame(start = sample(L3, 16, replace = T), end = sample(L3, 16, replace = T),
                weight = c(20,40,20,30,50,60,20,30,20,40,20,30,50,60,20,30))


g <- graph.data.frame(d, directed = T)

V(g)$name 
E(g)$weight

ideg <- degree(g, mode = "in", loops = F)

col=rainbow(12) # For edge colors

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 = layout.reingold.tilford)
4b9b3361

Ответ 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))

Ответ 2

Менее сложный метод, чем указано выше, если вы хотите сами назначить места node, - это добавить столбцы с метками x и y в вашем файле с координатами x и y для соответствующих узлов в этих столбцах. например

library('igraph')
nodes <- c('a','b','c','d')
x <- c(0,1,2,3)
y <- c(0,1,2,3)
from <- c('a','b','c')
to <- c('b','c','d')
NodeList <- data.frame(nodes, x ,y)
EdgeList <- data.frame(from, to)
a<- graph_from_data_frame(vertices = NodeList, d= EdgeList, directed = FALSE)
plot(a)

введите описание изображения здесь