Построение графика с петлей в 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)

Вы не включаете данные о формах и размерах, поэтому мы не можем сказать, о чем они. Вы можете увидеть команду печати, постепенно обновляющую цвета сети. В следующий раз постарайтесь подготовить вопрос более полно, чтобы упростить помощь. В следующий раз тебе может не повезти.

Другие вопросы по тегам