построение графика с циклом в 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. Я хочу, чтобы каждый кадр данных строки имел цвет, отличный от других строк. спасибо за вашу помощь.


person Sasa88    schedule 13.02.2015    source источник
comment
Создайте воспроизводимый пример. Я не верю, что вы показали, как вы создаете свой объект g. Кроме того, какова структура столбца Neighbors? Это символьное значение со вставленными запятыми? Потому что "3" %in% "3, 4" возвращает ЛОЖЬ. Вам нужен правильный вектор значений символов. "3" %in% c("3","4"). Включите dput() из algo2, чтобы было понятнее.   -  person MrFlick    schedule 13.02.2015
comment
мой график «g» я получил из текстового файла, это график с 34 узлами и 78 ребрами. я применяю процесс, чтобы собрать некоторые узлы друг с другом в соответствии с некоторыми критериями. и после этого я пишу это в каждой строке кадра данных «algo2», узлы, которые находятся вместе. я хочу дать каждой строке указанный цвет (чтобы сформировать что-то в виде групп)   -  person Sasa88    schedule 13.02.2015
comment
Кстати, еще немного совета по размещению. Вы можете взять переменную, такую ​​как algo2, которую вы используете, и сделать с ней dput(algo2). Это возвращает содержимое фрейма данных в консоль. Затем вы можете скопировать результат из консоли, и у вас будет variable <- structure(...). Любой, кто читает ваш пост, сможет оценить эту строку и будет иметь точно такие же данные, как и вы. Кажется, это самый простой способ воспроизвести ваш вопрос. Я узнал об этом совсем недавно, это очень полезная команда для stackoverflow.   -  person puslet88    schedule 15.02.2015


Ответы (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)$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)

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

person puslet88    schedule 13.02.2015
comment
V(g)$color ‹- if(V(g)$name %in% c(aa,nnn)){радуга(1)} Erreur dans V<-(*tmp*, value = 1:34): неверная индексация De plus: Message d'avis : In if (V(g)$name %in% c(aa, nnn)) { : la condition a une longueur › 1 et seul le premier élément est utilisé - person Sasa88; 13.02.2015
comment
спасибо @puslet88. я новичок в R и на этом форуме. и я плохо говорю по-английски. Спасибо за терпеливость. предложенное решение дает мне тот же результат. он отображает только последние обработанные узлы, то есть последнюю строку фрейма данных в цвете, а другие узлы рисуют их белым цветом. я хочу, чтобы для каждой итерации мы окрашивали обработанные узлы и сохраняли цвет для другого. то есть мой график будет рисоваться тремя цветами. Проблема в том, что я имею дело с графом из 10000 узлов, поэтому я использую радугу (i). просто я делаю тест на этом графике. спасибо - person Sasa88; 13.02.2015
comment
Я надеюсь, что это помогает! Хитрость здесь в том, что сначала вы делаете все белым, а затем добавляете один цвет за итерацию. Команда print должна показать, как это происходит в консоли. Если вы хотите построить каждую из групп отдельно, вы можете добавить функцию построения внутри цикла. Рад помочь, я также новый писатель здесь, но это оказалось очень полезным для обучения, особенно. Удачи! - person puslet88; 13.02.2015
comment
Спасибо @puslet88, я учту ваши замечания. - person Sasa88; 15.02.2015