Построение графика с петлей в 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
, Я хочу, чтобы каждая строка данных имела цвет, отличный от других строк. спасибо за вашу помощь
1 ответ
Ваша последняя строка цикла перезапишет все предыдущие операции.
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 с нуля. Мы не можем запустить цикл, не обращаясь к нему.
Ваша проблема решена путем замены "белого" цвета V(g)$ в этой строке. Однако я не уверен, что ваше предыдущее форматирование работало с ним. Рабочая версия с данной инициализацией есть.
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)
Вы не включаете данные о формах и размерах, поэтому мы не можем сказать, о чем они. Вы можете увидеть команду печати, постепенно обновляющую цвета сети. В следующий раз постарайтесь подготовить вопрос более полно, чтобы упростить помощь. В следующий раз тебе может не повезти.