Как изменить форму вершины в R с помощью igraph в соответствии с условием

#r #dataframe #nodes #igraph #vertex

Вопрос:

Я пытаюсь изменить vertex.shape, но это не работает :

У меня есть фрейм данных, такой как :

 Locus X2 X3 Prophage Vi_1236 Vi_456 5 yes Vi_1254 Vi_263 6 no Vi_1369 Vi_139 2 undef   

И я хочу получить график с диаграммой , на которой я могу раскрасить узлы в соответствии с их центральностью между ними и когда Профаг == «да», я хочу квадратный узел, когда его нет, узел круга, а когда его нет, узел треугольника.

Итак, я сделал :

 phage = graph.data.frame(innerJoinDf) vertex = ifelse(phage$prophage == "yes","square","circle") plot.igraph(phage, vertex.label = NA, vertex.color = betweenness(phage), vertex.shape = vertex)   

И я получаю следующую ошибку:

 Error in .igraph.shapes[[shape[el[x, 1]]]] :   wrong arguments for subsetting an environment  

Не могли бы вы, пожалуйста, помочь мне?

Комментарии:

1. Способ организации ваших данных Prophage -это атрибут ребра, а не атрибут вершины

2. Так как же я могу это сделать ?

3. Поэтому, предполагая, что вы хотите использовать Prophage для присвоения формы обеим вершинам, указанным в Locus и X2 и Prophage уникальным в ваших данных для этих вершин, один из способов, которым вы могли бы определить вектор, содержащий Prophage атрибут, vertex lt;- setNames(rep(innerJoinDf$Prophage, 2), unlist(innerJoinDf[c("Locus", "X2")])) а затем использовать его для обновления атрибута формы вершины вашего графика, который находится, V(g) например, в V(phage)$shape = c( "circle", "square")[(vertex[V(phage)$name] == "yes") 1L]

4. Спасибо, это работает, но что значит » 1 Л»

5. Например, innerJoinDf$Prophage == "yes" это логический вектор. Внутренне ИСТИННО == 1 и ЛОЖНО == 0. Поэтому, добавив единицу (1L-целое число 1), мы преобразуем логический вектор в вектор единиц и двоек (который затем мы используем для подмножества c( "circle", "square") вектора, например, выбираем первый или второй элемент).

Ответ №1:

То, как ваши данные организованы в innerJoinDf значениях, Prophage интерпретируется как граничные атрибуты. Вы можете увидеть это, посмотрев на свой igraph объект; где атрибуты вершины обозначены v символом, а ребро e -символом . (Вы можете увидеть фактические атрибуты с помощью vertex_attr(phage) и edge_attr(phage) ).

 library(igraph)  phage lt;- graph_from_data_frame(innerJoinDf) phage # IGRAPH d6af3b4 DN-- 6 3 --  #   attr: name (v/c), X3 (e/n), Prophage (e/c) #   edges from d6af3b4 (vertex names): # [1] Vi_1236-gt;Vi_456 Vi_1254-gt;Vi_263 Vi_1369-gt;Vi_139  

Ваш код vertex = ifelse(phage$prophage == "yes","square","circle") не сработал, так как вы не можете получить доступ к атрибутам напрямую с помощью $ обозначения (дополнительно Prophage начинается с верхнего регистра P ). Одним из способов доступа является использование V(graph) , E(graph) а затем $ , например, обозначения V(phage)$name .

Как вы хотите использовать Prophage для присвоения формы обеим вершинам, указанным в Locus , и X2 это предполагает, что Prophage это уникально в ваших данных для этих вершин. Один из способов сделать это-определить вектор, содержащий Prophage атрибут, а затем использовать его для обновления атрибута формы вершины вашего графика, в котором он хранится V(g) (вы, конечно, можете просто передать результаты из функции ifelse в igraph график вместо явного добавления shape атрибута).

 vertex lt;- setNames(rep(innerJoinDf$Prophage, 2), unlist(innerJoinDf[c("Locus", "X2")]))  vertex # Vi_1236 Vi_1254 Vi_1369 Vi_456 Vi_263 Vi_139  # "yes" "no" "undef" "yes" "no" "undef"   # This seems a bit convoluted but is an attempt to match by vertex name rather than order V(phage)$shape lt;- ifelse(vertex[V(phage)$name] == "yes", "square", "circle") # or # V(phage)$shape lt;- c( "circle", "square")[(vertex[V(phage)$name] == "yes")   1L] V(phage)$shape  # [1] "square" "circle" "circle" "square" "circle" "circle"  

Данные

 innerJoinDf=read.table(header=TRUE, text=" Locus X2 X3 Prophage Vi_1236 Vi_456 5 yes Vi_1254 Vi_263 6 no Vi_1369 Vi_139 2 undef")