在 R 中用循环绘制图形

plotting graph with loop in R

我想绘制一个图表,同时将循环应用于包含节点的数据框 algo2,并且对于每组节点我都会影响一种颜色。

这是我的数据框

> algo2
  node                                                         Neighbors
1   34 9, 10, 14, 15, 16, 19, 20, 21, 23, 24, 27, 28, 29, 30, 31, 32, 33
2    1                           2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 18, 22
3   26                                                                25

我在绘图前应用了这段代码:

for(i in 1:nrow(algo2)){ 

    nnn<-as.data.frame(algo2$Neighbors[i])  
    nnn<-as.character(nnn[,1])   
    aa<-as.character(algo2$node[i])  

    V(g)$color <- ifelse(V(g)$name %in% c(aa,nnn), 
                         rainbow(i), 
                         "white")

} 

V(g)$shape<-
    ifelse(V(g)$name %in% AllNeighbors2_algo2[,1], 
           "rectangle", 
           "circle") 
V(g)$size<-ifelse(V(g)$name %in% AllNeighbors2_algo2[,1], 
                  4, 
                  3)
plot.igraph(g, 
            vertex.color=V(g)$color, 
            vertex.size=V(g)$size, 
            vertex.shape=V(g)$shape)

问题是当我 运行 绘图时,它只取最后一个值,这意味着它只对顶点 2625 着色。我希望每行 od 数据框采用与其他行不同的颜色。感谢您的帮助。

循环的最后一行将覆盖之前的所有操作。

    V(g)$color <- ifelse(V(g)$name %in% c(aa,nnn), 
                     rainbow(i), 
                     "white")

它将检查与最后一个 i 的对应关系,并将其他所有内容设为白色。使用下面的代替,如果没有回答,它什么都不做。

    V(g)$color <-  if(V(g)$name %in% c(aa,nnn)) { rainbow(i)}

请注意,我无法对此进行测试,因为您的示例不可重现。对于可重现的示例,您应该将数据框作为我们可以评估的最小结构(而不​​是打印输出)。

如果之前它只是将最后一行着色,那么这应该可以。

更新:

好的,为了将来参考,可重现的数据框看起来像这样。

g <- graph.full(35, directed = FALSE)#, loops = FALSE)
V(g)$name <- c(1:35)
a <- paste(c(9, 10, 14, 15, 16, 19, 20, 21, 23, 24, 27, 28, 29, 30, 31, 32, 33), sep = "", collapse=", ")
b <- paste(c(2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 18, 22), sep = "", collapse=", ")
c <- as.character(25)
algo2 <- data.frame(node = c(34,1,26), Neighbors = c(1,2,3))
algo2$Neighbors[1] <- a                    
algo2$Neighbors[2] <- b
algo2$Neighbors[3] <- c

这可以做得更整洁,但你必须拥有它,否则任何评论者都必须自己制作,他们可能不会。您还有我无法评论的变量 All_Neighbours 。请注意,我还必须从头开始创建 g。我们不能 运行 循环而不引用它。

您的问题已通过将该行中的 "white" 替换为 V(g)$color 来解决。但是我不确定您以前的格式是否适用于它。具有给定初始化的工作版本是。

V(g)$color <- "White"

for(i in 1:nrow(algo2)){ 
  #i=1
  nnn<-as.data.frame(algo2$Neighbors[i])  
  nnn<- strsplit(as.character(nnn[,1]), ", ")[[1]]
  aa<-as.character(algo2$node[i])  

  V(g)$color <- ifelse(V(g)$name %in% c(aa,c(nnn[1:length(nnn)])), 
                       rainbow(i), 
                       V(g)$color)
  print(V(g)$color)

} 


plot.igraph(g, 
            vertex.color=V(g)$color)

您没有提供有关形状和大小的数据,因此我们无法判断它们的含义。您可以看到打印命令逐渐更新网络的颜色。下次尝试更充分地准备问题以简化辅助。下次你可能就没这么幸运了。