如何控制固定位置的IGRAPHE绘图布局?

如何控制固定位置的IGRAPHE绘图布局?,r,igraph,R,Igraph,我试图画一个网络可视化,类似于流程图。我对以下代码非常熟悉,但我有几个问题: 这是最好的layout()算法,还是可以手动为每个节点指定位置> 如何确保这些节点在绘图中不重叠(如此处所做) 我可以指定一个节点作为“锚点”或起点吗?i、 例如,我可以使“C”成为最上面的节点还是最左边的节点 非常感谢 library("igraph") L3 <- LETTERS[1:8] d <- data.frame(start = sample(L3, 16, replace = T), end

我试图画一个网络可视化,类似于流程图。我对以下代码非常熟悉,但我有几个问题:

  • 这是最好的layout()算法,还是可以手动为每个节点指定位置>
  • 如何确保这些节点在绘图中不重叠(如此处所做)
  • 我可以指定一个节点作为“锚点”或起点吗?i、 例如,我可以使“C”成为最上面的节点还是最左边的节点
  • 非常感谢

    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)
    
    库(“igraph”)
    
    L3igraph中的布局定义在一个矩阵中,每个节点有两列和一行。第一列表示其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
    
    您似乎还可以设置参数
    params
    来控制布局abit。这是一个列表,其中包含一个参数
    root
    ,显然可以用于设置图的根。为其分配一个节点编号(请记住,igraph对节点使用类似C的索引,第一个索引为0)。因此,将根设置为“C”:

    此函数的作用是将指定网格中布局的矩阵(类似于
    layout()
    )转换为具有x和y位置的两列布局。为每个节点定义一个零矩阵,从1到节点总数的整数(这是igraph ID+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))
    

    grid如果您想自己分配节点位置,一种比上述方法简单的方法是在数据表中添加标有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)
    
    library('igraph'))
    
    节点感谢您的提示!设置这样的位置将其放在一起:l2 2年后这个答案对我很有帮助:-)Sacha,当我应用您的代码时,我在ncol(x)中得到
    错误:找不到对象“L”
    。在
    绘图(g,layout=gridLayout(L))
    行中,可能存在我无法理解的问题。
    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)
    }
    
    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))
    
    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)