在 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)
问题是当我 运行 绘图时,它只取最后一个值,这意味着它只对顶点 26
和 25
着色。我希望每行 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)
您没有提供有关形状和大小的数据,因此我们无法判断它们的含义。您可以看到打印命令逐渐更新网络的颜色。下次尝试更充分地准备问题以简化辅助。下次你可能就没这么幸运了。
我想绘制一个图表,同时将循环应用于包含节点的数据框 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)
问题是当我 运行 绘图时,它只取最后一个值,这意味着它只对顶点 26
和 25
着色。我希望每行 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)
您没有提供有关形状和大小的数据,因此我们无法判断它们的含义。您可以看到打印命令逐渐更新网络的颜色。下次尝试更充分地准备问题以简化辅助。下次你可能就没这么幸运了。